Aller au contenu

Messages recommandés

Posté(e)

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

Invité chris6783
Posté(e)

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 ´

Posté(e)


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

Posté(e)

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

Posté(e)

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.

Posté(e)

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
Posté(e)

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
Posté(e)

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)

Posté(e)

et que te renvoie json.Tables.alerts[1] ? 

Ne trouverais-tu pas les champs disponibles / interrogeables ?

Posté(e)

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": [
	]
		
Posté(e)

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

Posté(e)

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
×
×
  • Créer...