pepite Posté(e) le 25 avril 2017 Signaler Posté(e) le 25 avril 2017 (modifié) 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é le 25 avril 2017 par pepite
Lazer Posté(e) le 25 avril 2017 Signaler Posté(e) le 25 avril 2017 En LUA les index c'est à partir de 1, donc [0] ça ne peut forcément pas marcher.
pepite Posté(e) le 26 avril 2017 Auteur Signaler Posté(e) le 26 avril 2017 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
jojo Posté(e) le 26 avril 2017 Signaler Posté(e) le 26 avril 2017 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)
jojo Posté(e) le 26 avril 2017 Signaler Posté(e) le 26 avril 2017 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....)
Lazer Posté(e) le 26 avril 2017 Signaler Posté(e) le 26 avril 2017 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) 1
jojo Posté(e) le 26 avril 2017 Signaler Posté(e) le 26 avril 2017 @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
pepite Posté(e) le 26 avril 2017 Auteur Signaler Posté(e) le 26 avril 2017 (modifié) 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 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é le 26 avril 2017 par pepite
Lazer Posté(e) le 26 avril 2017 Signaler Posté(e) le 26 avril 2017 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
pepite Posté(e) le 26 avril 2017 Auteur Signaler Posté(e) le 26 avril 2017 oui il le decode dans la fonction ;-)
Messages recommandés