cjson.decode()
によって返される値のTL;DR 、cjson.null
を使用します JSONのnull
と比較します 値。
説明:Luaはnil
を使用しています 削除されたエントリをマークするためにテーブルで。 JSONinc null
の場合 sはLunaticnil
に変換されました s、デコードされたオブジェクトが破損します。したがって、cjsonlibは軽量のuserdataタイプを使用してnull
を表します / nil
。
'call_data'にはnullの'date_created'フィールドがあります-これがエラーの原因です。
面白いことに、LuaのようにRedisはnil / null値を保存しないため、null値を無視するか、Redisで特別な値を使用してフラグを立てる必要があります。
それらを無視すると仮定すると、これを回避する1つの方法があります:
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を見てください。これは、あなたがやろうとしているように見えることを支援するように設計されています。