cjson.decode() многослойного JSON

Я хочу декодировать многослойный объект json в таблицу и распечатать значение «temp».

p=666
d=23.42
payload='{"d":
             {"pres":'..(p)..',"temp":'..(d)..'}
         }'

t = cjson.decode(payload)

Моя первая идея была примерно такой:

print(t["d"]["temp"])

Но это не сработало. Как мне улучшить этот код, чтобы он корректно декодировался с помощью Lua-CJson?


person trahloff    schedule 01.02.2016    source источник


Ответы (2)


У вас не может быть разрывов строк в кавычках.

Есть два решения:

  • удалите разрывы строк из '...'.

    payload='{"d": {"pres":'..(p)..',"temp":'..(d)..'} }'

  • используйте форму длинной строки: [[ ... ], которая допускает разрывы строк.

    payload=[[{"d": {"pres":]]..(p)..',"temp":'..(d)..[[} }]]

Вы также можете использовать шаблон, который проясняет ситуацию:

p=666
d=23.42
payload=[[
    { "d":
            {"pres": (p), "temp": (d)}
    }'
]]  
payload=payload:gsub("%((.-)%)",_G)
print(payload)

Если ваши поля не являются глобальными переменными, поместите их в таблицу и используйте эту таблицу вместо _G.

person lhf    schedule 01.02.2016
comment
Спасибо за подсказку с переводом строки. Но моя главная проблема заключалась в том, что у меня есть многоуровневый объект json, который анализируется в таблицу lua с помощью cjson.decode. Эта таблица lua действует как массив, но я могу получить доступ только к парам ключ: значение из первого слоя с чем-то вроде этого: print(t[d]), но я хочу получить доступ к значению temp во втором слое, но не нашел способа сделать это это. - person trahloff; 01.02.2016

Вложение Json напрямую не работает с cJson (по крайней мере, не на ESP8266 с NodeMCU). Я нашел решение, обернув массив вокруг вложенных значений.

p = 666
d = "23.42"
payload='{"d":[{"pres":'..(p)..',"temp":"'..(d)..'"}]}'
t = cjson.decode(payload)
print(t.d[1].temp) -- prints "23.42"

# Примечание 1. Это означает, что вы должны обратиться к массиву перед вызовом переменной t.d[1]. Массивы в Lua начинаются с числа 1. и НЕ отсчитываются от нуля, как многие другие языки сценариев.

# Примечание 2. По какой-то причине я получил ошибку «Неверное число» со значением с плавающей запятой (переменная d). В виде строки значение декодируется без ошибок. Мне пришлось сделать переменную строкой и поместить значение в двойные кавычки. --> ах, я узнал, что работаю над целочисленной версией nodeMCU, которая, по-видимому, не поддерживает числа с плавающей запятой...

person J.T. Houtenbos    schedule 05.06.2017