TL;DR 返回的值cjson.decode()
, use cjson.null
与 JSON 进行比较null
value.
说明:Lua使用nil
在表中标记已删除的条目。如果 JSONincnull
s 被转化为疯子nil
s,解码的对象将被损坏。因此,cjson lib使用轻量级的userdata类型来表示null
/nil
.
您的“call_data”有一个“date_created”字段为空 - 这会导致错误。
有趣的是,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))
附:如果你想的话,看看ReJSON我写的 - 它旨在帮助您完成您正在尝试做的事情。