TL;DR para valores retornados por
cjson.decode()
, use cjson.null
para comparar com o null
do JSON valor. Explicação:Lua usa
nil
nas tabelas para marcar as entradas excluídas. Se JSONinc null
s foram convertidos para Lunatic nil
s, os objetos decodificados estariam corrompidos. Portanto, a biblioteca cjson usa um tipo userdata leve para representar null
/nil
. Seu 'call_data' tem um campo 'date_created' que é nulo - isso causa o erro.
O engraçado é que o Redis, como Lua, não armazenará um valor nil/null, então você terá que ignorar valores nulos ou usar um valor especial no Redis para marcá-los.
Supondo que você irá ignorá-los, aqui está uma maneira de contornar isso:
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)
Além disso, uma pequena otimização seria agrupar as atualizações, assim:
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. se você quiser, veja o ReJSON que escrevi - ele foi projetado para ajudar com o que parece que você está tentando fazer.