TL;DR pro hodnoty vrácené cjson.decode()
, použijte cjson.null
pro srovnání s null
JSON hodnotu.
Vysvětlení:Lua používá nil
v tabulkách k označení smazaných záznamů. Pokud JSONinc null
s byly převedeny na šílence nil
s, dekódované objekty by byly poškozeny. Proto knihovna cjson používá odlehčený typ uživatelských dat k reprezentaci null
/nil
.
Vaše 'call_data' obsahuje pole 'date_created', které je prázdné – to způsobuje chybu.
Legrační je, že Redis, stejně jako Lua, neuloží hodnotu nula/null, takže budete muset buď ignorovat hodnoty null, nebo použít speciální hodnotu v Redis k jejich označení.
Za předpokladu, že je budete ignorovat, zde je jeden způsob, jak to obejít:
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)
Také by malou optimalizací bylo dávkovat aktualizace, například takto:
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. pokud chcete, podívejte se na ReJSON, který jsem napsal - je navržen tak, aby vám pomohl s tím, co se zdá, že se snažíte udělat.