Aller au contenu

Tableau json lua


pepite

Messages recommandés

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
Lien vers le commentaire
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
Lien vers le commentaire
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

Lien vers le commentaire
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
Lien vers le commentaire
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

 

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...