TL;DR untuk nilai yang dikembalikan oleh cjson.decode()
, gunakan cjson.null
untuk membandingkan dengan null
J JSON nilai.
Penjelasan:Lua menggunakan nil
dalam tabel untuk menandai entri yang dihapus. Jika JSONinc null
s dikonversi ke nil
Luna Lunatic s, objek yang didekodekan akan rusak. Oleh karena itu, cjson lib menggunakan tipe data pengguna yang ringan untuk mewakili null
/nil
.
'data_panggilan' Anda memiliki bidang 'tanggal_dibuat' yang nol - yang menyebabkan kesalahan.
Lucunya, Redis, seperti Lua, tidak akan menyimpan nilai nil/null, jadi Anda harus mengabaikan nilai null atau menggunakan nilai khusus di Redis untuk menandainya.
Dengan asumsi Anda akan mengabaikannya, inilah satu cara untuk mengatasinya:
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)
Selain itu, pengoptimalan kecil adalah mengelompokkan pembaruan, seperti:
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. jika Anda mau, lihat ReJSON yang saya tulis - ini dirancang untuk membantu apa yang tampaknya Anda coba lakukan.