gpt4 book ai didi

json - Redis Lua 区分空数组和对象

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

当我在redis 3.2 中使用脚本在json 对象中设置特定值时,我在cjson lua 中遇到了这个错误。

目前redis中的lua不区分空json数组和空json对象。这在序列化其中包含数组的 json 对象时会导致严重问题。

eval "local json_str = '{\"items\":[],\"properties\":{}}' return cjson.encode(cjson.decode(json_str))" 0

结果:

"{\"items\":{},\"properties\":{}}"

我找到了这个解决方案 https://github.com/mpx/lua-cjson/issues/11但我无法在 redis 脚本中实现。

这是一次不成功的尝试:

eval 

"function cjson.mark_as_array(t)
local mt = getmetatable(t) or {}
mt.__is_cjson_array = true
return setmetatable(t, mt)
end
function cjson.is_marked_as_array(t)
local mt = getmetatable(t)
return mt and mt.__is_cjson_array end
local json_str = '{\"items\":[],\"properties\":{}}'
return cjson.encode(cjson.decode(json_str))"

0

感谢任何帮助或指点。

最佳答案

有两个计划。

  1. 修改lua-cjson源码编译redis,点击here了解详情。

  2. 通过代码修复:

local now = redis.call("time")
-- local timestamp = tonumber(now[1]) * 1000 + math.floor(now[2]/1000)
math.randomseed(now[2])
local emptyFlag = "empty_" .. now[1] .. "_" .. now[2] .. "_" .. math.random(10000)
local emptyArrays = {}
local function emptyArray()
if cjson.as_array then
-- cjson fixed: https://github.com/xiyuan-fengyu/redis-lua-cjson-empty-table-fix
local arr = {}
setmetatable(arr, cjson.as_array)
return arr
else
-- plan 2
local arr = {}
table.insert(emptyArrays, arr)
return arr
end
end

local function toJsonStr(obj)
if #emptyArrays > 0 then
-- plan 2
for i, item in ipairs(emptyArrays) do
if #item == 0 then
-- empty array, insert a special mark
table.insert(item, 1, emptyFlag)
end
end

local jsonStr = cjson.encode(obj)
-- replace empty array
jsonStr = (string.gsub(jsonStr, '%["' .. emptyFlag .. '"]', "[]"))

for i, item in ipairs(emptyArrays) do
if item[1] == emptyFlag then
table.remove(item, 1)
end
end
return jsonStr
else
return cjson.encode(obj)
end
end


-- example
local arr = emptyArray()
local str = toJsonStr(arr)
print(str) -- "[]"

关于json - Redis Lua 区分空数组和对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43272872/

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