2009-07-28 10 views
2

PHPスクリプトから返されるJSONオブジェクトを反復しようとしています。PHPからJSONを解析する

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

をしかし、私は行うことはできません:JavaScriptで私が行うことができます、だから、

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

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

:戻り部分のようなものです

alert(resp.errors.length); 

私はerrorsを反復したいと思い、だから私は長さを取得しようとしている。誰かが私にヒントを与えることができますか?ありがとう!

答えて

3

これを行うには、resp.errorsがJavascriptオブジェクトではなくJavascript配列である必要があります。

PHPでは、配列に名前付きキーを付けることができます。 Javascriptでは不可能です。 json_encodeを使用するときに、errors PHPの配列は、JSオブジェクトに「翻訳」される:あなたのJSONデータは次のようになります。

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

代わりに、あなたはそれが次のようになりたいです:

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

配列に "errors"があり、名前付きキーはありません。

それを達成するために、あなたのPHPコードをする必要があります:

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

は(ジャストerrorsに名前付きのキーを削除)

+0

forループを使用してオブジェクトのプロパティを反復することができます。 – jason

+0

合意。配列を扱う場合は、配列を使用しないのはなぜですか? (そして、あなたはhasOwnPropertyなどを使う必要はありません) –

1

あなたのJSON出力を見てください。あなたを介してループしたい場合は(あなたがそれを連想配列ではなく、数値添字の配列を通過したからです。)あなたが見ることができるように

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

が、それはオブジェクトではなく、配列です:resp.errorsはこのようなものになりますJavaScriptでのオブジェクトは、あなたはこのようにそれを実行します。

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

あなたはそれがJavaScriptの配列になりたい場合は、あなたのPHPは次のよ​​うになります。

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

あなたはFirebugの中で評価されたオブジェクトを検査した場合、あなたはでしょう「エラー」は配列ではなくオブジェクトです(PHPの関連配列はJSのオブジェクトに変換されます)。したがって、オブジェクトを反復処理するには、for-inステートメントを使用する必要があります。

プロトタイププロパティではなく、送信したものであることを確認するには、すべてのプロパティ名をhasOwnPropertyでチェックする必要があります。