【问题标题】:cjson decode in Lua returns array of empty arrays redis-cliLua中的cjson解码返回空数组redis-cli
【发布时间】:2019-01-13 14:05:20
【问题描述】:

我有一个大型 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 decode 创建 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编码的。

【问题讨论】:

    标签: lua redis redis-cli cjson


    【解决方案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
    

    【讨论】:

    • 这似乎是答案,但它只是显示了 Lua 脚本的局限性。使用节点脚本完成这项任务很简单。
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2017-01-12
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多