TL;DR dla wartości zwracanych przez cjson.decode()
, użyj cjson.null
do porównania z null
JSON-a wartość.
Wyjaśnienie:Lua używa nil
w tabelach, aby zaznaczyć usunięte wpisy. Jeśli JSONinc null
s zostały przekonwertowane na Lunatic nil
s, zdekodowane obiekty byłyby uszkodzone. Dlatego cjson lib używa lekkiego typu danych użytkownika do reprezentowania null
/nil
.
Twoje „call_data” ma pole „date_created”, które ma wartość NULL — co powoduje błąd.
Zabawne jest to, że Redis, podobnie jak Lua, nie przechowuje wartości zero/null, więc będziesz musiał albo zignorować wartości null, albo użyć specjalnej wartości w Redis, aby je oznaczyć.
Zakładając, że będziesz je ignorować, oto jeden sposób:
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)
Ponadto niewielka optymalizacja polegałaby na grupowaniu aktualizacji, na przykład:
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 jeśli chcesz, spójrz na ReJSON, który napisałem – ma pomóc w tym, co wydaje się, że próbujesz zrobić.