TL;DR pour les valeurs renvoyées par cjson.decode()
, utilisez cjson.null
à comparer au null
de JSON valeur.
Explication :Lua utilise nil
dans les tableaux pour marquer les entrées supprimées. Si JSONinc null
s ont été convertis en Lunatic nil
s, les objets décodés seraient corrompus. Par conséquent, la bibliothèque cjson utilise un type de données utilisateur léger pour représenter null
/nil
.
Votre 'call_data' a un champ 'date_created' qui est nul - ce qui provoque l'erreur.
Ce qui est amusant, c'est que Redis, comme Lua, ne stockera pas de valeur nil/null, vous devrez donc soit ignorer les valeurs nulles, soit utiliser une valeur spéciale dans Redis pour les signaler.
En supposant que vous les ignorez, voici une solution :
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)
De plus, une petite optimisation consisterait à regrouper les mises à jour, comme suit :
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 si vous voulez, regardez ReJSON que j'ai écrit - il est conçu pour vous aider avec ce que vous essayez de faire.