2016-02-01 11 views
2

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

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

t = cjson.decode(payload) 

Моя первая мысль была что-то вроде этого:

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

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

ответ

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.

+0

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

0

Nesting 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 - это означает, что вы должны обратиться массив перед вызовом переменной тд [1] - Массивы в Lua начинаются с числа и NOT нулевой, как и многие другие языки сценариев.

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