cjson.decode()
. द्वारा लौटाए गए मानों के लिए TL;DR , उपयोग करें cjson.null
JSON के null
. से तुलना करने के लिए मूल्य।
व्याख्या:लुआ nil
का उपयोग करता है हटाई गई प्रविष्टियों को चिह्नित करने के लिए तालिकाओं में। अगर JSONinc null
s को पागल nil
. में बदल दिया गया s, डिकोड की गई वस्तुएं भ्रष्ट होंगी। इसलिए, cjson lib null
. का प्रतिनिधित्व करने के लिए हल्के उपयोगकर्ताडेटा प्रकार का उपयोग करता है /nil
।
आपके 'call_data' में एक 'date_created' फ़ील्ड है जो शून्य है - जो त्रुटि का कारण बनता है।
मजेदार बात यह है कि रेडिस, लुआ की तरह, एक शून्य/शून्य मान संग्रहीत नहीं करेगा, इसलिए आपको या तो शून्य मानों को अनदेखा करना होगा या उन्हें ध्वजांकित करने के लिए रेडिस में एक विशेष मान का उपयोग करना होगा।
यह मानते हुए कि आप उन्हें नज़रअंदाज़ कर रहे हैं, इसका एक तरीका यह है:
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))
पी.एस. यदि आप चाहते हैं, तो मेरे द्वारा लिखे गए ReJSON को देखें - यह आपकी मदद करने के लिए डिज़ाइन किया गया है जो ऐसा प्रतीत होता है कि आप करने का प्रयास कर रहे हैं।