首页 > 解决方案 > Lua中的cjson解码返回空数组redis-cli

问题描述

我有一个大型 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.

标签: luaredisredis-clicjson

解决方案


如果您的 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

推荐阅读