TL;DR voor waarden geretourneerd door cjson.decode()
, gebruik cjson.null
om te vergelijken met JSON's null
waarde.
Uitleg:Lua gebruikt nil
in tabellen om verwijderde items te markeren. Als JSONinc null
s zijn geconverteerd naar Lunatic nil
s, zouden de gedecodeerde objecten beschadigd zijn. Daarom gebruikt de cjson-lib een lichtgewicht type gebruikersgegevens om null
weer te geven /nil
.
Uw 'call_data' heeft een 'date_created' veld dat null is - dat de fout veroorzaakt.
Het grappige is dat Redis, net als Lua, geen nul/nul-waarde opslaat, dus je moet ofwel null-waarden negeren of een speciale waarde in Redis gebruiken om ze te markeren.
Ervan uitgaande dat je ze negeert, is hier een manier om het te omzeilen:
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)
Een kleine optimalisatie zou ook zijn om de updates te batchen, zoals:
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 als je wilt, kijk dan eens naar ReJSON die ik heb geschreven - het is ontworpen om te helpen met wat het lijkt dat je probeert te doen.