Zorgonaute84 Posté(e) le 24 juin 2015 Signaler Posté(e) le 24 juin 2015 Bonjour, J'appel a tous les experts du forum. Je cherche a décoder et exploiter une requête JSON. Mon soucis, est que cette requête peut envoyer quelque chose, comme elle peut ne rien envoyer... Donc quand j'ai un retour aucun soucis mon code marche, par contre, quand cette derniere ne renvoie rien j'aimerai que d'une mon code ne plante pas, et pouvoir enregistrer manuellement une valeur. Exemple de mon code : local Mavariable = jsonTable.liste[1].titre Donc quand ma requête json contient bien une liste 1 avec une valeur titre, aucun soucis ! La ou c'est plus compliqué c'est quand la liste est vide. Mon code plante donc quand il cherche la 1ere itération de la liste. Avez vous une astuce car la je sèche ! Merci
jojo Posté(e) le 24 juin 2015 Signaler Posté(e) le 24 juin 2015 essaye ceci local Mavariable = jsonTable.liste[1].titre or ""
Zorgonaute84 Posté(e) le 24 juin 2015 Auteur Signaler Posté(e) le 24 juin 2015 Pas mieux... J'ai toujours l'erreur : [ERROR] 16:35:06: line 34: attempt to index field '?' (a nil value)
Invité chris6783 Posté(e) le 24 juin 2015 Signaler Posté(e) le 24 juin 2015 Il faut vérifier que jsonTable.liste n'est pas null avant d'essayer d'accéder àses éléments. De même si la liste existe il faudra encore vérifier qu'elle comporte bien un élément avant d'accéder à´ titre ´
Lazer Posté(e) le 24 juin 2015 Signaler Posté(e) le 24 juin 2015 local Web = Net.FHttp("1.2.3.4", 80) response, status, errorCode = Web:GET(/url) if tonumber(errorCode) == 0 and tonumber(status) == 200 then if response ~= nil and response ~= "" then jsonTable = json.decode(response) Mavariable = jsonTable.liste[1].titre or "" if Mavariable then -- ... else -- ... end end end
Zorgonaute84 Posté(e) le 24 juin 2015 Auteur Signaler Posté(e) le 24 juin 2015 Merci c'est exactement ce que je cherche sauf que la requête contient plusieurs listes et seul une d'entre elle peut être vide. Les autres sont toujours renseignées et ne pose pas de problème. La dans ton code Lazer on test si tout response est vide. Envoyé de mon iPhone en utilisant Tapatalk
Lazer Posté(e) le 24 juin 2015 Signaler Posté(e) le 24 juin 2015 Pas certain de bien comprendre poste ton code on le corrigera, je pense qu'il faut juste que tu positionne les "if" qui vont bien.
Zorgonaute84 Posté(e) le 25 juin 2015 Auteur Signaler Posté(e) le 25 juin 2015 Alors voila en ce qui concerne mon code : Ici la partie de la requete json local WGROUND = Net.FHttp("api.wunderground.com",80); local response ,status, err = WGROUND:GET("/api/"..APIkey.."/conditions/forecast/astronomy/alerts/lang:FR/q/"..station..":"..StationID..".json"); if (tonumber(status) == 200 and tonumber(err)==0) then if (response ~= nil) then local jsonTable = json.decode(response) ici j'interroge la réponse sur une des liste (current_observation) qui elle a TOUJOURS du contenu : local stationID = jsonTable.current_observation.station_id Ici j'interroge la réponse sur la liste des alertes qui peut contenir 0 ou plusieurs alertes. Je ne cherche qu'a interroger la première (il y a quand meme rarement plusieurs alertes). Mais le probleme se présente quand la liste alerts est vide car pas d'alerte météo. La j'ai le message d'erreur cité plus haut. local AlerteLvl = jsonTable.alerts[1].level_meteoalarm_name
jojo Posté(e) le 25 juin 2015 Signaler Posté(e) le 25 juin 2015 donc tu dois faire le test de Lazer àce niveau if jsonTable.alerts[1].level_meteoalarm_name ~= nil then local AlerteLvl = jsonTable.alerts[1].level_meteoalarm_name else local AlerteLvl = "" end
Zorgonaute84 Posté(e) le 25 juin 2015 Auteur Signaler Posté(e) le 25 juin 2015 J'avais essayé dans ce sens, mais en faisant == nil sans succés. J'ai alors essayé ton code, mais idem... La condition : if jsonTable.alerts[1].level_meteoalarm_name ~= nil renvoi l'erreur : [ERROR] 11:35:34: line 97: attempt to index field '?' (a nil value)
jojo Posté(e) le 25 juin 2015 Signaler Posté(e) le 25 juin 2015 et que te renvoie json.Tables.alerts[1] ? Ne trouverais-tu pas les champs disponibles / interrogeables ?
Zorgonaute84 Posté(e) le 25 juin 2015 Auteur Signaler Posté(e) le 25 juin 2015 Alors non il trouve bien le champs quand il est rempli car si je vise une ville avec alerte météo, le code fonctionne sans soucis. En exemple une ville avec alerte : "alerts": [ { "type": "WRN", "wtype_meteoalarm": "3", "wtype_meteoalarm_name": "Thunderstorms", "level_meteoalarm": "2", "level_meteoalarm_name": "Yellow", "level_meteoalarm_description": "The weather is potentially dangerous. The weather phenomena that have been forecast are not unusual, but be attentive if you intend to practice activities exposed to meteorological risks. Keep informed about the expected meteorological conditions and do not take any avoidable risk.", "description": "Thunderstorms", "date": "2015-06-25 09:00:00 GMT", "date_epoch": "NA", "expires": "2015-06-25 15:00:00 GMT", "expires_epoch": "NA", "message": "Thunderstorms)", "phenomena": "NA", "significance": "NA", "attribution": "Information provided by , <a href='http://meteoalarm.eu/'>EUMETNET - MeteoAlarm</a> Note: Time delays between this website and <a href='http://meteoalarm.eu/'>Meteoalarm.eu</a> are possible. For the most up-to-date information about alert levels as published by the participating National Meteorological Services, please visit <a href='http://meteoalarm.eu/'>Meteoalarm</a>.'>http://meteoalarm.eu/'>Meteoalarm</a>. For terms of use of this information, and copyright information, see <a href='http://meteoalarm.eu/'>Meteoalarm</a> Terms of Use." } ] et sans alerte : "alerts": [ ]
Zorgonaute84 Posté(e) le 25 juin 2015 Auteur Signaler Posté(e) le 25 juin 2015 Ah bah c'est bon j'ai trouvé grace a ta question !!! Au lieu de : if jsonTable.alerts[1].level_meteoalarm_name ~= nil J'ai posé la condition ainsi : if jsonTable.alerts[1] ~= nil Et ca fonctionne ! Merci
Zorgonaute84 Posté(e) le 25 juin 2015 Auteur Signaler Posté(e) le 25 juin 2015 Je vais devenir fou !!!!! Alors la condition marche très bien par contre le code dedans ne fonctionne plus ! A devenir dingue ! Avec conditions : if jsonTable.alerts[1] ~= nil then local AlerteLvl = jsonTable.alerts[1].level_meteoalarm_name or "" local AlerteDescription = jsonTable.alerts[1].wtype_meteoalarm_name or "" fibaro:debug("Alerte") else AlerteLvl = "Niveau 0" AlerteDescription = "Pas d'alerte" fibaro:debug("Pas d'alerte") end fibaro:debug(AlerteLvl) fibaro:debug(AlerteDescription) fibaro:call(selfId,'setProperty', 'ui.lblAlerteLvl.value',AlerteLvl) fibaro:call(selfId,'setProperty', 'ui.lblAlerteDesc.value',AlerteDescription) Si je vise une ville sans alerte j'ai ca : [DEBUG] 14:18:00: Envois d'une requete à Wunderground [DEBUG] 14:18:01: Pas d'alerte [DEBUG] 14:18:01: Niveau 0 [DEBUG] 14:18:01: Pas d'alerte Si je vise une ville avec alerte j'ai ca : [DEBUG] 14:18:40: Envois d'une requete à Wunderground [DEBUG] 14:18:41: Alerte [ERROR] 14:18:41: line :debug (arg 2), expected 'string const &' got 'nil' Maintenant si je supprimer la condition : --if jsonTable.alerts[1] ~= nil --then local AlerteLvl = jsonTable.alerts[1].level_meteoalarm_name or "" local AlerteDescription = jsonTable.alerts[1].wtype_meteoalarm_name or "" fibaro:debug("Alerte") --else --AlerteLvl = "Niveau 0" --AlerteDescription = "Pas d'alerte" --fibaro:debug("Pas d'alerte") --end fibaro:debug(AlerteLvl) fibaro:debug(AlerteDescription) fibaro:call(selfId,'setProperty', 'ui.lblAlerteLvl.value',AlerteLvl) fibaro:call(selfId,'setProperty', 'ui.lblAlerteDesc.value',AlerteDescription) Et que je vise une ville avec alerte : [DEBUG] 14:20:08: Envois d'une requete à Wunderground [DEBUG] 14:20:08: Alerte [DEBUG] 14:20:08: Yellow [DEBUG] 14:20:08: Thunderstorms
jojo Posté(e) le 25 juin 2015 Signaler Posté(e) le 25 juin 2015 et bien on est 2 àdevenir fou, si ça peut te rassurer. Un petit restart de la box ?
Lazer Posté(e) le 25 juin 2015 Signaler Posté(e) le 25 juin 2015 C'est normal, tu définies ta variable AlerteDescription en local dans le bloc de la condition if, donc elle est inconnue dès que tu sors du bloc ! cf : [Tuto HC2] Précis Sur Les Variables Locales/globales 2
jojo Posté(e) le 25 juin 2015 Signaler Posté(e) le 25 juin 2015 Que ne l'ais-je pas vu plus tôt. Merci Lazer pour ce rappel
Zorgonaute84 Posté(e) le 26 juin 2015 Auteur Signaler Posté(e) le 26 juin 2015 Ahhhh merci Lazer. Je corrige mon code de suite ! Envoyé de mon iPhone en utilisant Tapatalk
Zorgonaute84 Posté(e) le 26 juin 2015 Auteur Signaler Posté(e) le 26 juin 2015 Le code est corrigé et fonctionne parfaitement ! Merci ! Je termine mon module et le partage rapidement.
Messages recommandés