gpt4 book ai didi

json - 如何检查 Redis 的 Lua cjson 中的 nil/null?

转载 作者:IT王子 更新时间:2023-10-29 06:10:40 26 4
gpt4 key购买 nike

我有一个代码块如下的lua脚本:

local call_data     = cjson.decode(ARGV[1])
local other_data = cjson.decode(ARGV[2])
local data = {}
local next = next
local populate_data = function(source)
if next(source) == nil then
return
end

for property,value in pairs(source) do
redis.call('HSET', KEYS[2], property, value)
end
end
populate_data(call_data)
populate_data(other_data)

当我尝试使用以下命令 KEYS 和 ARGV 运行脚本时:-

redis-cli --eval dialed.lua "inflight_stats:18" "calls:AC443d7a8111a96ba8074f54a71f0521ce:CA1ec49703eee1959471c71506f43bb42e:dialed" , "{\"from\":\"+18035224181\",\"to\":\"+919943413333\",\"sid\":\"CA1ec49703eee1959471c71506f43bb42e\",\"status\":\"queued\",\"direction\":\"outbound-api\",\"date_created\":null,\"account_sid\":\"AC443d8a8111a96ba8074f54a71f0521ce\"}" "{\"phone\":\"919943413333\",\"campaign_id\":18,\"caller_session_sid\":\"CA828b163153bf5cc301ef5285e38925f9\"}" 0

错误:-

(error) ERR Error running script (call to f_08dcc69ee8baa0200e0cf552948ab4bc338c9978): @user_script:11: @user_script: 11: Lua redis() command arguments must be strings or integers 

最佳答案

TL;DR 对于 cjson.decode() 返回的值,使用 cjson.null 与 JSON 的 null 值进行比较。

说明:Lua 在表中使用nil 来标记已删除的条目。如果将 JSONinc null 转换为 Lunatic nil,则解码后的对象将损坏。因此,cjson 库使用轻量级的用户数据类型来表示null/nil

您的“call_data”有一个“date_created”字段为空 - 这会导致错误。

有趣的是,Redis 和 Lua 一样,不会存储 nil/null 值,因此您必须要么忽略 null 值,要么在 Redis 中使用特殊值来标记它们。

假设您将忽略它们,这是一种解决方法:

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我写的 - 它旨在帮助您完成您正在尝试做的事情。

关于json - 如何检查 Redis 的 Lua cjson 中的 nil/null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52888109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com