2016-02-01 1 views
2

Je souhaite décoder un objet json multicouche dans une table et imprimer la valeur de "temp".cjson.decode() d'un JSON multicouche

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

t = cjson.decode(payload) 

Ma première idée était quelque chose comme ceci:

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

Mais cela ne fonctionne pas. Comment puis-je améliorer ce code afin qu'il décode correctement en utilisant Lua-CJson?

Répondre

2

Vous ne pouvez pas avoir de sauts de ligne dans les chaînes entre guillemets.

Il y a deux solutions:

  • supprimer les sauts de ligne de '...'.

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

  • utiliser la forme longue chaîne: [[ ... ], ce qui permet des sauts de ligne.

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

Vous pouvez également utiliser un modèle, ce qui rend les choses plus claires:

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

Si vos champs ne sont pas des variables globales, les mettre dans une table et d'utiliser cette table au lieu de _G.

+0

Merci pour l'indice avec le linebreak. Mais mon problème principal était que j'ai un objet json multicouche qui est analysé dans une table lua avec cjson.decode. Cette table lua fonctionne comme un tableau mais je peux uniquement accéder aux paires clé/valeur du premier calque avec quelque chose comme ceci: print (t ["d"]) mais je veux accéder à la valeur "temp" dans la deuxième couche mais n'a trouvé aucun moyen de le faire. – trahloff

0

Imbrication Json ne semble pas directement fonctionner avec cJson (au moins pas sur l'ESP8266 avec NodeMCU) J'ai trouvé une solution en enveloppant un tableau autour des valeurs imbriquées.

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

# Note 1 - cela signifie que vous devez adresser le tableau avant d'appeler la variable td [1] - tableaux en Lua commencent par le nombre et sont NOT base zéro comme beaucoup d'autres langages de script.

# Remarque 2 - pour une raison quelconque, j'ai reçu une erreur 'nombre mal formé' avec la valeur à virgule flottante (variable d). En tant que chaîne, la valeur est décodée sans erreur. J'ai dû faire de la variable une chaîne et mettre des "guillemets doubles" autour de la valeur. -> ah J'ai découvert que je travaillais sur une version entière de nodeMCU - qui apparemment ne supporte pas les nombres à virgule flottante ...