2009-07-28 33 views
2

Ich versuche, in einem JSON-Objekt iterieren, die von einem PHP-Skript zurückgegeben wird. Der Rückteil ist so etwas wie:Parsing JSON von 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; 

Also, in JavaScript ich tun kann:

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

Aber ich kann nicht tun:

alert(resp.errors.length); 

ich errors iterieren möchten, Deshalb versuche ich, die Länge zu bekommen. Kann mir jemand einen Hinweis geben? Vielen Dank!

Antwort

3

Um dies tun zu können, benötigen Sie resp.errors als Javascript-Array und kein Javascript-Objekt.

In PHP können Arrays haben Schlüssel genannt; das ist in Javascript nicht möglich; so, wenn json_encode verwenden, die errors PHP-Array "übersetzt" zu einem JS-Objekt: Ihre JSON-Daten wie folgt aussieht:

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

Stattdessen würden Sie es wie folgt aussehen:

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

Beachten Sie, dass "errors" in einem Array ohne Named-Keys.

Um das zu erreichen, Ihr PHP-Code würde sein müssen:

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

(einfach die Namen-Tasten auf errors entfernen)

+0

Sie können eine For-In-Schleife verwenden, um Objekteigenschaften zu iterieren. – jason

+0

Einverstanden; Aber wenn Sie mit einem Array arbeiten möchten, warum verwenden Sie kein Array? (und auf diese Weise müssen Sie nicht hasOwnProperty oder ähnliches verwenden) –

1

Sehen Sie sich Ihren JSON-Ausgang an. resp.errors wird so etwas wie dieses:

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

Wie Sie sehen, es ist ein Objekt, kein Array (., Da Sie es ein assoziativen Array übergeben und nicht ein numerisch indiziertes Array) Wenn Sie durch eine Schleife wollen ein Objekt in JavaScript, tun Sie es wie folgt aus:

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

Wenn Sie es wollen, eine JavaScript-Array sein, Ihre PHP sollte wie folgt aussehen:

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

Wenn Sie das ausgewerteten Objekt in Firebug inspizieren, würden Sie Beachten Sie, dass "Fehler" kein Array, sondern ein Objekt ist (assoziierte Arrays in PHP werden in JS in Objekte übersetzt). Sie müssen also for-in Anweisung verwenden, um durch ein Objekt zu iterieren.

Sie müssen jeden Eigenschaftsnamen mit hasOwnProperty überprüfen, um sicherzustellen, dass es etwas ist, das Sie gesendet haben, nicht irgendeine Prototypeigenschaft.