[PHP]json_decode した stdClass Object を扱う

Pocket

stdClass Object
(
    ["sample"] => stdClass Object
        (
            ["color"] => red
        )

    ["0"] => stdClass Object
        (
            ["color"] => green
        )

)

json_decode をすると第2引数を指定しない限り上のようになることがあります。
sample の color を取り出すなら、「$foo->sample->color」で良いのですが、
[0] のほうを取り出そうとして「$foo->0->color」とやってもエラーになります。
かといって $foo->item(0) みたいなものがあるわけでもないようなので、
素直に Array にキャストするのが普通ですが、もし強引にそのまま扱いたいのであれば

$foo->{'0'}->color

のようにすればとりあえず取れます。

とは言え扱いにくいので json_decode($foo, true) として連想配列にしておいたほうがいいと思います。


2012/11/24 追記:
この方法はキーがString型の場合のみ使用できます。


Similar Posts:




  1. PHPのバージョンはどうなっていますでしょうか?

    PHP5での挙動を確認したところ、プロパティ名がString型ではない場合に{‘property’}の形式が使えないようでした。
    PHP4では正常に動作していました。

    この仕様変更どうなんでしょうね・・・

  2. <?php
    //PHP 5.4.7
    $array = array(
      "sample" => array("color" => "red"),
      array("color" => "green")
    );
    
    $encoded = json_encode($array);
    $decoded = json_decode($encoded);
    
    echo $decoded->{'0'}->color;
    //結果「green」
    

    コメントありがとうございます。
    一応上記ソースでPHP 5.4.7および5.3.6での動作を確認できました。

    json_encodeの特性上、数字以外のキー名を含む配列をエンコードした場合、すべてのキーがString型に変換されるため、エラーは発生しませんが、配列のすべてのキーが数字の場合int型として変換されるため、この方法は使えないことになります。

    json_encodeを行う際、「json_encode($array, JSON_FORCE_OBJECT)」としておくことで回避する方法もあると思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です