parser json
Le
Olivier Masson

Bonjour,
Dans une variable, j'ai une structure JSON :
var infos = [
{nom: "xxx", prenom: "thomas", adresse:{rue:"avenue victor hugo", num:
"18", cp:"06000", ville:"NICE"}},
{nom: "yyy", prenom: "éric", adresse:{rue:"rue delille", num: "23",
cp:"75000", ville:"PARIS"}},
{nom: "zzz", prenom: "jeanne", adresse:{rue:"impasse toulouse lautrec",
num: "5", cp:"77500", ville:"CHELLES"}}
];
Et je veux récupérer un array contenant toutes les adresses.
Faut-il passer par un quelconque parser JSON ou est-ce une opération
simple en JS ?
Merci.
Dans une variable, j'ai une structure JSON :
var infos = [
{nom: "xxx", prenom: "thomas", adresse:{rue:"avenue victor hugo", num:
"18", cp:"06000", ville:"NICE"}},
{nom: "yyy", prenom: "éric", adresse:{rue:"rue delille", num: "23",
cp:"75000", ville:"PARIS"}},
{nom: "zzz", prenom: "jeanne", adresse:{rue:"impasse toulouse lautrec",
num: "5", cp:"77500", ville:"CHELLES"}}
];
Et je veux récupérer un array contenant toutes les adresses.
Faut-il passer par un quelconque parser JSON ou est-ce une opération
simple en JS ?
Merci.
infos est donc un tableau d'objets.
Il faut donc tout simplement parcourir le tableau et récupérer ce dont
on a besoin.
// votre "infos" et "adresses" le tableau qui contiendra les adresses
var infos = [
{nom: "xxx", prenom: "thomas", adresse:{rue:"avenue victor hugo", num:
"18", cp:"06000", ville:"NICE"}},
{nom: "yyy", prenom: "éric", adresse:{rue:"rue delille", num: "23",
cp:"75000", ville:"PARIS"}},
{nom: "zzz", prenom: "jeanne", adresse:{rue:"impasse toulouse lautrec",
num: "5", cp:"77500", ville:"CHELLES"}}
], adresses = [];
// on boucle dans "infos"
for(i in infos){
// on ajoute dans "adresses", l'adresse de l'élément actuellement
parcouru
adresses.push(infos[i].adresse);
}
console.log(adresses);
"adresses" sera, ici, un tableau de 3 objets (chaque objet contiendra
les attributs rue, num, cp et ville)
Merci beaucoup, j'étais parti dans des trucs super compliqués.
Cette notion d'objet m'échappe vraiment.
Une fois le tableau adresses récupéré, je peux afficher chaque élément
en faisant par exemple adresses[2]["cp"], c'est-à-dire la même notation
que pour les tableaux. Et adresses[2].cp fonctionne aussi.
et si c'est pour seulement afficher qques adresses le passage par un
autre array n'est pas vraiment utile.
function affiche(cecp) {
for(n in infos) if(infos[n].adresse.cp == cecp)
document.write('<p>'+
infos[n].prenom+' '+
infos[n].nom + '<br>n'+
infos[n].adresse.num+' '+infos[n].adresse.rue+'<br>n'+
infos[n].adresse.cp+' '+infos[n].adresse.ville+'</p>n');
}
affiche('75000');
--
Stéphane Moriaux avec/with iMac-intel
Tout à fait. Si vous connaissez PHP, pensez les objets JS comme un
tableau associatif PHP (en un peu plus poussé).
Cela ferait en PHP
$adresses = array(
array(
"rue"=>"avenue victor hugo",
"num"=>"18",
"cp"=>"06000",
"ville"=>"NICE"
),
array(
...
), etc.
);
Pour avoir le "cp", vous feriez $adresses[0]["cp"];
Cela dit, vous pouvez aussi boucler sur adresses, si vous ne voulez pas
vous taper toutes les possibilités.
for(i in adresses){
console.log(adresses[i].cp); // ou adresses[i]["cp"];
}
Si c'est pour de l'affichage, il ne faudrait pas utiliser
document.write(). D'une part parce que c'est intrusif (il faut mettre
"affiche()" pile à l'endroit voulu dans le html) et d'autre part car ce
nouveau "<p>" ne sera pas reconnu dans le dom (à part sur les derniers
navigateurs qui seront un petit peu plus intelligent) et donc impossible
de jouer dessus par la suite en JS.
Quitte à reprendre votre code, je ferai :
function affiche(cecp) {
for(n in infos){
if(infos[n].adresse.cp == cecp){
newP = document.createElement("p");
newP.innerHTML = newP.innerHTML +
infos[n].prenom+' '+
infos[n].nom + '<br>n'+
infos[n].adresse.num+'
'+infos[n].adresse.rue+'<br>n'+
infos[n].adresse.cp+' '+infos[n].adresse.ville;
document.body.appendChild(newP);
}
}
}
affiche('75000');
Le mieux étant d'avoir déjà une balise prête dans le html (style <p
id="infos"></p>) et le remplir avec un p =
document.getElementById("infos").innerHTML = ...
toutafé et même si ça peut fonctionner.
C'était plus axé sur le mini-traitement du "à-la-Json" ;-)
(que sur son enrobage)
c'est vrai que ce n'est guère bp + compliqué.
Voilà !
Merci des précisions et correctifs.
--
Stéphane Moriaux avec/with iMac-intel
Oui, je connais PHP et c'est bien mon problème :)
Ce n'était pas un besoin pour de l'affichage mais pour avoir un fichier
unique (le contenu de la variable adresses) utilisable par deux applis
JS qui n'accepte pas le même format en entrée.
J'ai pu avoir le format qui convenait (un array d'array) ainsi :
for (i in infos) {
adresses[i] = [ infos[i].adresse.rue, infos[i].adresse.num,
infos[i].adresse.cp, infos[i].adresse.ville ];
}
Ce serait plus beau avec un Array.push()
for (i in infos) {
adresses.push = [ infos[i].adresse.rue, infos[i].adresse.num,
infos[i].adresse.cp, infos[i].adresse.ville ];
}
ou y'a mieux ?
Voui mézenfi array[n] ne mange guère d'avoine ;-)
"push" s'emploie comme une fonction
for (i in infos) {
adresses.push([infos[i].adresse.rue, infos[i].adresse.num,
infos[i].adresse.cp, infos[i].adresse.ville]);
}
for (i in infos) {
with(infos[i].adresse){ adresses.push( [rue, num, cp, ville] ); }
}
for (i in infos) {
var a = infos[i].adresse;
adresses.push([a.rue, a.num, a.cp, a.ville]);
}
--
Stéphane Moriaux avec/with iMac-intel