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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Clément
Le #24374901
Le 03/04/2012 19:10, Olivier Masson a écrit :
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"}}
];



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)
Olivier Masson
Le #24375471
Le 03/04/2012 22:47, Clément a écrit :

// 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.
SAM
Le #24377361
Le 04/04/12 10:45, Olivier Masson a écrit :
Le 03/04/2012 22:47, Clément a écrit :

// 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
Clément
Le #24377951
Le 04/04/2012 10:45, Olivier Masson a écrit :
Le 03/04/2012 22:47, Clément a écrit :

// 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.



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"];
}
Clément
Le #24377981
Le 05/04/2012 04:24, SAM a écrit :
Le 04/04/12 10:45, Olivier Masson a écrit :
Le 03/04/2012 22:47, Clément a écrit :

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');





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 = ...
SAM
Le #24378241
Le 05/04/12 11:38, Clément a écrit :
Le 05/04/2012 04:24, SAM a écrit :

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');





Si c'est pour de l'affichage, il ne faudrait pas utiliser
document.write().



toutafé et même si ça peut fonctionner.
C'était plus axé sur le mini-traitement du "à-la-Json" ;-)
(que sur son enrobage)

Quitte à reprendre votre code, je ferai :

function affiche(cecp) {



c'est vrai que ce n'est guère bp + compliqué.

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 = ...



Voilà !
Merci des précisions et correctifs.


--
Stéphane Moriaux avec/with iMac-intel
Olivier Masson
Le #24378471
Le 05/04/2012 11:28, Clément a écrit :

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.



Tout à fait. Si vous connaissez PHP, pensez les objets JS comme un
tableau associatif PHP (en un peu plus poussé).




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 ];
}
Clément
Le #24380981
Le 05/04/2012 14:58, Olivier Masson a écrit :
Le 05/04/2012 11:28, Clément a écrit :

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.



Tout à fait. Si vous connaissez PHP, pensez les objets JS comme un
tableau associatif PHP (en un peu plus poussé).




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()
Olivier Masson
Le #24381331
Le 06/04/2012 13:44, Clément a écrit :
Le 05/04/2012 14:58, Olivier Masson a écrit :
Le 05/04/2012 11:28, Clément a écrit :

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.



Tout à fait. Si vous connaissez PHP, pensez les objets JS comme un
tableau associatif PHP (en un peu plus poussé).




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 ?
SAM
Le #24381441
Le 06/04/12 16:38, Olivier Masson a écrit :
Le 06/04/2012 13:44, Clément a écrit :



Ce serait plus beau avec un Array.push()





Voui mézenfi array[n] ne mange guère d'avoine ;-)

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 ?



"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
Publicité
Poster une réponse
Anonyme