Redis
 sql >> Base de données >  >> NoSQL >> Redis

Comment vérifier nil/null dans Lua cjson de Redis?

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.