2009-07-28 3 views
2

J'essaie de parcourir un objet JSON renvoyé par un script PHP. La partie de retour est quelque chose comme:Analyse de JSON à partir de PHP

$json = array("result" => -1, 
    "errors" => array(
    "error1" => array("name" => "email","value" => "err1"), 
    "error2" => array("name" => "pass","value" => "err2") 
     ) 
     ); 

$encoded = json_encode($json); 
echo $encoded; 

Ainsi, en JavaScript je peux faire:

var resp = eval('(' + transport.responseText + ')'); 
alert(resp.length); 
alert(resp.errors.error1.name); 

Mais je ne peux pas faire:

alert(resp.errors.length); 

Je voudrais itérer errors, C'est pourquoi j'essaie d'avoir la longueur. Quelqu'un peut-il me donner un indice? Merci!

Répondre

3

Pour pouvoir faire cela, vous avez besoin de resp.errors pour être un tableau Javascript, et non un objet Javascript.

En PHP, les tableaux peuvent avoir des clés nommées; ce n'est pas possible en Javascript; ainsi, lors de l'utilisation json_encode, le errors tableau PHP est « traduit » à un objet JS: vos données JSON ressemble à ceci:

{"result":-1,"errors":{"error1":{"name":"email","value":"err1"},"error2":{"name":"pass","value":"err2"}}} 

Au lieu de cela, vous voulez qu'il ressemble à ceci:

{"result":-1,"errors":[{"name":"email","value":"err1"},{"name":"pass","value":"err2"}]} 

Notez que "errors" dans un tableau, sans clé nommée.

Pour cela, votre code PHP devrait être:

$json = array(
    "result" => -1, 
    "errors" => array(
      array("name" => "email","value" => "err1"), 
      array("name" => "pass","value" => "err2") 
     ) 
    ); 
$encoded = json_encode($json); 
echo $encoded; 

(Il suffit de retirer les clés nommées-sur errors)

+0

Vous pouvez utiliser une boucle for in pour itérer les propriétés de l'objet. – jason

+0

D'accord; mais si vous voulez travailler avec un tableau, pourquoi ne pas utiliser un tableau? (et, de cette façon, vous n'aurez pas à utiliser hasOwnProperty ou similaire) –

1

Regardez votre sortie JSON. resp.errors sera quelque chose comme ceci:

{"error1": {"name": "email", "value": "err1"}, ...} 

Comme vous pouvez le voir, il est un objet, pas un tableau (. Puisque vous transmit un tableau associatif et non un tableau numérique) Si vous voulez faire une boucle par un objet JavaScript, vous le faites comme ceci:

for (var error in resp.errors) { 
    alert(resp.errors[error].name); 
} 

Si vous voulez qu'il soit un tableau JavaScript, votre PHP devrait ressembler à ceci:

$json = array("result" => -1, "errors" => array(
    array("name" => "email","value" => "err1"), 
    array("name" => "email","value" => "err1") 
)); 
0

Si vous inspectez l'objet évalué à Firebug, vous le feriez voir que "errors" n'est pas un tableau mais un objet (les tableaux associés en PHP se traduisent par des objets dans JS). Vous devez donc utiliser l'instruction for-in pour parcourir un objet.

Vous devez vérifier chaque nom de propriété avec hasOwnProperty pour être sûr que c'est quelque chose que vous avez envoyé, pas une propriété du prototype.