TL; DR表示由返回的值
cjson.depre(),用于
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.depre(ARGV[1])local other_data = cjson.depre(ARGV[2])local data = {}local next = nextlocal null = cjson.nulllocal 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 endendpopulate_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-它旨在帮助您解决您试图做的事情。



