我有一个很大的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
编码的。
答案 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