TL;DR for værdier returneret af cjson.decode()
, brug cjson.null
at sammenligne med JSON's null
værdi.
Forklaring:Lua bruger nil
i tabeller for at markere slettede poster. Hvis JSONinc null
s blev konverteret til Lunatic nil
s, ville de afkodede objekter være korrupte. Derfor bruger cjson lib en letvægts brugerdatatype til at repræsentere null
/nil
.
Dine 'call_data' har et 'date_created'-felt, der er null - som forårsager fejlen.
Det sjove er, at Redis, ligesom Lua, ikke vil gemme en nul/nul værdi, så du bliver enten nødt til at ignorere nulværdier eller bruge en speciel værdi i Redis for at markere dem.
Hvis du antager, at du ignorerer dem, er der én måde at undgå det på:
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 lille optimering ville også være at batchere opdateringerne, som sådan:
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. Hvis du vil, så se på ReJSON, som jeg skrev - den er designet til at hjælpe med, hvad det ser ud til, at du forsøger at gøre.