TL;DR för värden som returneras av cjson.decode()
, använd cjson.null
att jämföra med JSONs null
värde.
Förklaring:Lua använder nil
i tabeller för att markera raderade poster. Om JSONinc null
s konverterades till Lunatic nil
s, de avkodade objekten skulle vara korrupta. Därför använder cjson lib en lättviktig användardatatyp för att representera null
/nil
.
Din "call_data" har ett "date_created"-fält som är null - som orsakar felet.
Det roliga är att Redis, liksom Lua, inte kommer att lagra ett noll/nollvärde, så du måste antingen ignorera nollvärden eller använda ett speciellt värde i Redis för att flagga dem.
Förutsatt att du kommer att ignorera dem, här är en väg runt det:
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)
En liten optimering skulle också vara att batcha uppdateringarna, som så:
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))
P.S. Om du vill, titta på ReJSON som jag skrev - den är utformad för att hjälpa till med vad det verkar som du försöker göra.