cjson decode in Lua возвращает массив пустых массивов 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, чтобы перенести эти данные в более управляемую форму. Однако, когда я пытаюсь создать таблицу lua, используя декодирование cjson...
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 МБ) Строка была закодирована с использованием JSON.stringify
,
1 ответ
Если ваш JSON является массивом string/number/bool, вы можете просто вернуть json_foo
и Redis может проанализировать массив для вас.
Однако ваш JSON - это массив объектов, который слишком сложен для разбора Redis. Вы должны разобрать это в своем скрипте Lua. Например, вы хотите вернуть все идентификаторы вашего массива JSON:
local json_foo = cjson.decode(string_foo)
local ids = {}
for idx, ele in pairs(json_foo) do ids[idx] = ele["id"] end
return ids