Parser du JSON avec lua

Forum dédié aux problématiques concernant les scripts pour DomoticZ.
Entourez votre code et les logs avec les balises nommées code grâce au bouton <\>.
chatainsim
Messages : 42
Inscription : 25 mars 2015, 17:04

Parser du JSON avec lua

Message par chatainsim »

Bonjour,

J'essaye de parser ce fichier json:

Code : Tout sélectionner

{
  "station": [
    "L800001020",
    "W141001001"
  ],
  "idx": {
    "height": {
      "L800001020": "218",
      "W141001001": "215"
    },
    "speed": {
      "L800001020": "217",
      "W141001001": "216"
    }
  },
  "notifications": {
    "height": {
      "W141001001": {
        "test": "ge",
        "value": "2",
        "active": "true"
      },
      "L800001020": {
        "test": "gt",
        "value": "1",
        "active": "true"
      }
    },
    "speed": {
      "W141001001": {
        "test": "ge",
        "value": "100",
        "active": "true"
      },
      "L800001020": {
        "test": "ge",
        "value": "140",
        "active": "true"
      }
    }
  }
}
Avec ce code (morceau du script) :

Code : Tout sélectionner

    local file = assert(io.open(config, "r"))
    local json_text = file:read("*all")
    file:close()
    local Conf = json:decode(json_text)
    Station = Conf.station
for k,v in pairs(Station) do
        local IDStation = v
        local IDXHeight = Conf.idx.height.v
        local IDXSpeed = Conf.idx.speed.v
        local NotifHeightV = Conf.notifications.height.v.value
        [...]
Mais par exemple pour récupérer la valeur de la variable IDXHeight, j'utilise Conf.idx.height.v mais le v n'est pas remplacer par sa valeur.
Pareil pour NotifHeightV = Conf.notifications.height.v.value.

Comment forcer lua a remplacer v par sa valeur ?

Merci
Dernière modification par chatainsim le 12 janv. 2018, 17:00, modifié 1 fois.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Parser du JSON avec lua

Message par vil1driver »

Salut,

Et en remplaçant

Code : Tout sélectionner

for k,v in pairs(Station) do
Par

Code : Tout sélectionner

for k,v in pairs(Conf.idx.heigh) do
Dernière modification par vil1driver le 12 janv. 2018, 15:10, modifié 3 fois.
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
chatainsim
Messages : 42
Inscription : 25 mars 2015, 17:04

Re: Parser du JSON avec lua

Message par chatainsim »

vil1driver a écrit :Salut,

Et en suppriment

Code : Tout sélectionner

for k,v in pairs(Station) do
Et v qui n'existe pas par le bon terme ex:

Code : Tout sélectionner

L800001020
?
C'est ma boucle pour parcourir les ID stations.
Du coup je ne peux pas le supprimer, c'est même elle qui assigne les valeurs à la variable v
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Parser du JSON avec lua

Message par vil1driver »

J'ai edité mon message pdt que tu écrivais

Des print...

Affiche k et v dans ta boucle pour comprendre
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
chatainsim
Messages : 42
Inscription : 25 mars 2015, 17:04

Re: Parser du JSON avec lua

Message par chatainsim »

vil1driver a écrit :J'ai edité mon message pdt que tu écrivais

Des print...

Affiche k et v dans ta boucle pour comprendre
La variable v est bien assigné, c'est simplement quand je parse le json avec

Code : Tout sélectionner

local IDXHeight = Conf.idx.height.v 
ou

Code : Tout sélectionner

local NotifHeightV = Conf.notifications.height.v.value
Il faudrait qu'il remplace v par sa valeur assigné, par exemple avec la station L800001020:

Code : Tout sélectionner

local IDXHeight = Conf.idx.height.L800001020
local NotifHeightV = Conf.notifications.height.L800001020.value
Mais il ne considère pas v comme étant une variable dans ce cas là.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Parser du JSON avec lua

Message par vil1driver »

si tu ne parcours que Station, tu ne peux pas avoir les info des autres...
il te faut parcourir idx pour lire son contenu

Code : Tout sélectionner

for k,v in pairs(Conf.idx.height) do
	print(k..':'..v)

end
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
chatainsim
Messages : 42
Inscription : 25 mars 2015, 17:04

Re: Parser du JSON avec lua

Message par chatainsim »

vil1driver a écrit :si tu ne parcours que Station, tu ne peux pas avoir les info des autres...
il te faut parcourir idx pour lire son contenu

Code : Tout sélectionner

for k,v in pairs(Conf.idx.height) do
	print(k..':'..v)

end
Sauf que j'utilise la boucle for car Station est un tableau et idx n'en ai pas un.
C'est pour cela que j'essaye d'accéder directement aux valeurs avec la variable v.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Parser du JSON avec lua

Message par vil1driver »

si idx est un tableau.. contient des ensembles clés/valeurs, valeurs qui à leur tour sont des tableaux..

Code : Tout sélectionner

print(typeof(Conf.idx))
print(table_show(Conf.idx, "Conf.idx"))  
for k,v in pairs(Conf.idx.height) do
	print(k..':'..v)

end
renvoi :
table
Conf.idx = {
["height"] = {
["W141001001"] = "215";
["L800001020"] = "218";
};
["speed"] = {
["W141001001"] = "216";
["L800001020"] = "217";
};
};
W141001001:215
L800001020:218
je ne vois pas ce que tu veux de plus...
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
chatainsim
Messages : 42
Inscription : 25 mars 2015, 17:04

Re: Parser du JSON avec lua

Message par chatainsim »

vil1driver a écrit :si idx est un tableau.. contient des ensembles clés/valeurs, valeurs qui à leur tour sont des tableaux..

Code : Tout sélectionner

print(typeof(Conf.idx))
print(table_show(Conf.idx, "Conf.idx"))  
for k,v in pairs(Conf.idx.height) do
	print(k..':'..v)

end
renvoi :
table
Conf.idx = {
["height"] = {
["W141001001"] = "215";
["L800001020"] = "218";
};
["speed"] = {
["W141001001"] = "216";
["L800001020"] = "217";
};
};
W141001001:215
L800001020:218
je ne vois pas ce que tu veux de plus...
Accéder directement à la valeur qui correspond à Conf -> idx -> height -> L800001020
Sans faire une boucle.

Car je récupère un ID de station puis les IDX lié à cet ID de station et les infos de notifications liè puis passer à l'ID de la station suivante etc ...

Mais peut être que je me complique la vie.
vil1driver
Messages : 5661
Inscription : 30 janv. 2015, 11:07
Localisation : Rennes (35)

Re: Parser du JSON avec lua

Message par vil1driver »

Code : Tout sélectionner

for k,v in pairs(Station) do
        local IDStation = v
        local IDXHeight = Conf.idx.height[v]
        local IDXSpeed = Conf.idx.speed[v]
        local NotifHeightV = Conf.notifications.height[v].value
	print('station: '..IDStation..' height: '..IDXHeight..' speed: '..IDXSpeed..' NotifHeightV: '..NotifHeightV)
end
MAJ = VIDER LE CACHE(<-Clicable)
/!\Les mises à jour de Domoticz sont souvent sources de difficultés, ne sautez pas dessus
modules.lua

Un ex domoticzien
Répondre