Lua中的cjson解码返回空数组的数组redis-cli

时间:2018-08-06 15:01:21

标签: lua redis redis-cli cjson

我有一个很大的JSON对象数组,它们以编码字符串的形式存储在redis中。

local string_foo = redis.call("get", "foo")

"[{\"id\":\"xxxxxxxx\",\"block-scope\":[],\"history\":[{\"type\":\"answer\",\"timestamp\":1516295540951,\"message\":{\"mid\":\"mid.$cAACRSqSkpgVnO4cWglhCkHOU0XJQ\",\"seq\":24216,\"text\":\"fdjl\"}},{\"messageType\":\"text\",\"type\":\"messa ..."

我想使用lua脚本遍历此数组,以将这些数据迁移为更易于管理的形式。但是,当我尝试使用cjson解码创建lua表时...

local json_foo = cjson.decode(string_foo)

[[],[],[],[],[]...]

我得到了一个空数组或集合的列表(redis-cli ldb不确定是哪个)

1) (empty list or set)
2) (empty list or set)
3) (empty list or set)
4) (empty list or set)
5) (empty list or set)
....

为什么会这样?它很大,但不是很大。(〜6 MB)该字符串是使用JSON.stringify编码的。

1 个答案:

答案 0 :(得分:1)

如果您的JSON是字符串/数字/布尔型数组,则只需返回json_foo,然后Redis可以为您解析该数组。

但是,您的JSON是对象数组,对于Redis而言,解析起来太复杂了。您必须在Lua脚本中解析它。例如,您要返回JSON数组的所有ID:

local json_foo = cjson.decode(string_foo)
local ids = {}
for idx, ele in pairs(json_foo) do ids[idx] = ele["id"] end
return ids