TL; DR cho các giá trị được trả về bởi cjson.decode()
, sử dụng cjson.null
để so sánh với null
của JSON giá trị.
Giải thích:Lua sử dụng nil
trong bảng để đánh dấu các mục đã xóa. Nếu JSONinc null
s đã được chuyển đổi thành Lunatic nil
s, các đối tượng được giải mã sẽ bị hỏng. Do đó, lib cjson sử dụng loại dữ liệu người dùng nhẹ để đại diện cho null
/ nil
.
'Call_data' của bạn có trường 'date_create' không có giá trị - nguyên nhân gây ra lỗi.
Điều buồn cười là Redis, giống như Lua, sẽ không lưu trữ giá trị nil / null, vì vậy bạn sẽ phải bỏ qua các giá trị null hoặc sử dụng một giá trị đặc biệt trong Redis để gắn cờ chúng.
Giả sử bạn sẽ bỏ qua chúng, đây là một cách giải quyết vấn đề:
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)
Ngoài ra, một tối ưu hóa nhỏ sẽ là thực hiện hàng loạt các bản cập nhật, như vậy:
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. nếu bạn muốn, hãy xem ReJSON mà tôi đã viết - nó được thiết kế để trợ giúp những gì bạn đang cố gắng thực hiện.