小编典典
TL; DR表示由返回的值cjson.decode(),用于cjson.null与JSON的null值进行比较。
说明:Lua nil在表中用于标记已删除的条目。如果将JSONinc null转换为Lunatic nil,则解码的对象将损坏。因此,cjson
lib使用轻量级的userdata类型表示null/ nil。
您的“ call_data”具有一个“ date_created”字段,该字段为null-导致错误。
有趣的是,Redis与Lua一样,不会存储nil / null值,因此您必须忽略null值,或者在Redis中使用特殊值来标记它们。
假设您将忽略它们,这是一种解决方法:
local call_data = cjson.decode(ARGV[1])
local other_data = cjson.decode(ARGV[2])
local data = {}
local next = next
local null = cjson.null
local populate_data = function(source)
if next(source) == nil then
return
end
for property,value in pairs(source) do
if value ~= null then
redis.call('HSET', KEYS[2], property, value)
end
end
end
populate_data(call_data)
populate_data(other_data)
另外,一个小的优化将是批量更新,如下所示:
local payload = {}
for property,value in pairs(source) do
if value ~= null then
table.insert(payload, property)
table.insert(payload, value)
end
end
redis.call('HSET', KEYS[2], unpack(payload))
PS,如果您愿意的话,请看一下我编写的ReJSON-它旨在帮助您解决您试图做的事情。
2020-06-20