TL;DR за стойности, върнати от cjson.decode()
, използвайте cjson.null
за сравнение с null
на JSON стойност.
Обяснение:Lua използва nil
в таблици, за да маркирате изтрити записи. Ако JSONinc null
s бяха преобразувани в Lunatic nil
s, декодираните обекти ще бъдат повредени. Следователно, библиотеката cjson използва олекотен тип потребителски данни за представяне на null
/nil
.
Вашият „call_data“ има поле „date_created“, което е нула – това причинява грешката.
Забавното е, че Redis, подобно на Lua, няма да съхранява стойност nula/null, така че ще трябва или да игнорирате нулеви стойности, или да използвате специална стойност в Redis, за да ги маркирате.
Ако приемем, че ще ги игнорирате, ето един начин да го заобиколите:
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)
Също така, малка оптимизация би била да се пакетират актуализациите, както следва:
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. ако искате, вижте ReJSON, който написах – той е предназначен да помогне с това, което изглежда, че се опитвате да направите.