Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

parser json

22 réponses
Avatar
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.

10 réponses

1 2 3
Avatar
Clément
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)
Avatar
Olivier Masson
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.
Avatar
SAM
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
Avatar
Clément
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"];
}
Avatar
Clément
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 = ...
Avatar
SAM
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
Avatar
Olivier Masson
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 ];
}
Avatar
Clément
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()
Avatar
Olivier Masson
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 ?
Avatar
SAM
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
<http://fr.selfhtml.org/javascript/objets/array.htm>
<http://fr.selfhtml.org/javascript/objets/array.htm#push>


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
1 2 3