Aller au contenu
pepite

Tableau json lua

Recommended Posts

Bonsoir, 

 

J'ai un souci de lecture de json, je n'arrive pas a descendre dans les tableaux des objets du json 

J'ai utilisé http://jsonviewer.stack.hu pour vérifier et je me suis dit que ça devrait le faire comme ceci, mais non.

 

json.drenchers[0].name et je voulais récupérer "Haie laurier" de l id 187...etc

 

Pourriez vous m'éclairer les experts svp ? la je buggue, le json est trop complique lol. pour ma culture ;-) et ça mériterait un petit toto pour les nuls ;-)

{
adjustWater: 0,
rainDelay: 0,
cycles: 1,
drenchers: 
 
[
 
{
id: 187,
name: "Haie Laurier",
mode: "off",
dead: "false",
manualTime: 0,
days: [ ],
cycles: 
 
[
 
{
hour: 2,
minute: 10,
duration: 3
}
],
nextDrenching: 0,
state: "false"
},
 
{
id: 188,
name: "Bute",
mode: "off",
dead: "false",
manualTime: 0,
days: [ ],
cycles: 
 
[
 
{
hour: 2,
minute: 20,
duration: 3
}
],
nextDrenching: 0,
state: "false"
},
 
{
id: 201,
name: "Pelouse Etendoir",
mode: "off",
dead: "false",
manualTime: 0,
days: [ ],
cycles: 
 
[
 
{
hour: 2,
minute: 30,
duration: 5
}
],
nextDrenching: 0,
state: "false"
},
 
{
id: 202,
name: "Fleurs Etendoir",
mode: "off",
dead: "false",
manualTime: 0,
days: [ ],
cycles: 
 
[
 
{
hour: 2,
minute: 40,
duration: 3
}
],
nextDrenching: 0,
state: "false"
},
 
{
id: 205,
name: "Pelouse Bassin",
mode: "off",
dead: "false",
manualTime: 0,
days: [ ],
cycles: 
 
[
 
{
hour: 2,
minute: 50,
duration: 5
}
],
nextDrenching: 0,
state: "false"
},
 
{
id: 206,
name: "Haie Cloture",
mode: "off",
dead: "false",
manualTime: 0,
days: [ ],
cycles: 
 
[
 
{
hour: 3,
minute: 0,
duration: 3
}
],
nextDrenching: 0,
state: "false"
},
 
{
id: 329,
name: "Cuisine",
mode: "off",
dead: "false",
manualTime: 0,
days: [ ],
cycles: 
 
[
 
{
hour: 3,
minute: 10,
duration: 2
}
],
nextDrenching: 0,
state: "false"
}
]
}

 

 

 

Modifié par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites

En LUA les index c'est à partir de 1, donc [0] ça ne peut forcément pas marcher.

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour@Lazer,
Merci pour l info :-). J avais aussi testé avec 1 mais pas mieux :-)
Je comprends pas. Il y a une subtilite que je ne maitrise pas du tout avec ce json.

Envoyé de mon Nexus 5X en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Dès que je sais à la maison (ce soir) je te dis quoi. Je dois encore avoir un exemple de code qui ferait ce que tu veux faire (et il vient éventuellement de mettre @steven)

Partager ce message


Lien à poster
Partager sur d’autres sites

Je me demande si le code ne se trouve pas dans un des VD que j'avais fait pour les panneaux de chauffage. Regarde dans ma signature (ou attend ce soir....) 

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai l'impression que tu as écrasé la classe LUA prédéfinie "json" avec ta varaible "json", problème connu depuis quelques firmwares (et c'est tant mieux, ça oblige à nommer ses variables proprement et d'arrêter de faire n'importe quoi)

 

Donc il faudrait faire un truc du genre, de tête (attention code brut et pas propre sans test de la valeur de retour de api.get() :
 

local response = api.get(...)
local mon_joli_json_rien_que_pour_moi = json.decode(data)
fibaro:debug(mon_joli_json_rien_que_pour_moi.drenchers[1].name or "il y a encore un autre problème")

-- vous remarquerez que le nom de la variable est bidon, mais c'est pour bien montrer qu'il faut différencier nos variables persos des variables prédéfinies du système.... a vous de trouver des noms de variables qui soient parlant pour le futur relecteur de votre code (ou vous-même dans 1 an quand vous aurez oublié ce que vous avez fait précédemment)

 

  • Upvote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@pepite,

Voici donc le code dont je te parlais :

-- backup de la configuration détaillée des heating panels
result = result.. "<BR><BR>-- Backup configuration des Heating Panls généré le : " .. os.date("%d/%m/%y à %X")
result = result.. '<BR><BR>local ConfigHP = {<BR>-- "name", "day", "part", "hour", "minute", "temperature", '
for k, v in pairs(jsonListe) do
  jsonTable =  api.get("/panels/heating/"..v.id)
  result = result ..'<BR>"' .. jsonTable.name ..'", '
  for _,Day in pairs(Days) do
    result = result ..'<BR>"'..Day..'", '
    for _,Part in pairs(DayParts) do
      result = result .. '"'..Part..'", '
      result = result ..'"'.. jsonTable.properties[Day][Part].hour ..'", '
      result = result ..'"'.. jsonTable.properties[Day][Part].minute ..'", '
      result = result ..'"'.. jsonTable.properties[Day][Part].temperature ..'", '
    end  -- DayParts
  end -- Days

ceci avec les infos de @Lazer devraient te permettre de résoudre ton problème

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci messieurs @Lazer et
@jojo

J'ai du faire la boulette, je ne peux rien tester, c'est pour un membre qui n'arrive plus à modifier le rainDelay du panneau d'arrosage et cela fonctionnait avant ;-).

J'ai écrit trop vite sans reflechir et effectivement tu as raison Lazer (je suis au courant de cette modif pourtant quel idiot, j'ai pe fait perdre du temps au membre bloqué) je dois écraser le json.decode avec le json = api.get... Je vais lui demander de retester , vais changer le nom de la variable..

 

je lui avais envoyé cela en boulet que je suis :60:

local json = api.get("/api/panels/drenchers")
fibaro:debug("Lecture de json.rainDelay avant modification: " ..json.rainDelay.. " Cycles : " ..json.cycles)
fibaro:debug("Nom  187 : " ..json.drenchers[1].name)

 

Parenthèse : Lazer tu continues à tester avec la fonction api.get malgré les tests dans la fonction elle-même ? Tu testes le status ?

 

Modifié par pepite

Partager ce message


Lien à poster
Partager sur d’autres sites

En fait, tu viens de me faire remarquer involontairement qu'il n'y a même pas besoin du json.decode, car le api.get le fait en interne, j'avais oublié ça !!

 

Dans tous les cas, c'est toujours une bonne habitude de tester, pour éviter les plantages LUA.

TU remarqueras le "or" dans mon fibaro:debug qui sert à sert, mais ce n'est pas suffisant.

Si l'élément 1 du tableau de la variable JSON n'existe pas, cela va crasher aussi, donc il faut d'abord valider son existence.

 

Si je reprend mon exemple corrigé ça donne ça :

local jsonTable = api.get(...)
if jsonTable and jsonTable.drenchers and jsonTable.drenchers[1] and jsonTable.drenchers[1].name then
	fibaro:debug(jsonTable.drenchers[1].name)
else
	fibaro:debug("Il manque des champs dans l'arbre JSON")
end

 

Partager ce message


Lien à poster
Partager sur d’autres sites

oui il le decode dans la fonction ;-)

Partager ce message


Lien à poster
Partager sur d’autres sites

×