json_decodeの配列がstdClassになってしまう場合の対処法

PHPでJSON化した文字列を元のデータに戻すのに使われるのがjson_decode関数です。

これを使っていたらある問題に直面したのでその解決策を書いていきます。

json_decodeを使っていて困ったこと

その問題とは元のデータに戻すときに配列(array)がstdClassに変換されてしまうことです。

例えば例を挙げると次のような感じ

 

まずPHP内で次のような連想配列を作るとしましょう。

 

そしてこれを一旦 json_encode でJSONにしてもう一度 json_decode で戻して中身を表示してみます。

 

するとどのような内容が表示されるかというと次の通り

本来 Array と表示されるべき場所が stdClass になっています。

 

それでこの stdClass が何者なのかを調べてみると次のような特徴を持つクラスのようです。

  • あらかじめ用意されているデフォルトクラス
  • プロパティもメソッドも何も持たない
  • 存在しないプロパティにもアクセスできる

なぜかググっても公式リファレンスがヒットしませんでしたが、ビルトインクラスです。

 

当然クラスなので配列とは全く別物です。

存在できないプロパティにアクセスできてしまう上に、 $fruits['Apple'] のように配列的な書き方もできません。

これはどうすればいいのかと悩みましたね。

でも意外とすぐに解決策が見つかりました。

json_decodeの引数にtrueを渡せばいいだけだった

結論から書くとjson_decodeの2番目の引数にtrueを渡すだけで解決しました。

先ほどの例なら次のようにするということです。

 

これで次のように stdClass ではなく Array として表示されるようになりました。

やり方さえ分かれば簡単ですが知らないので何時間も悩んでしまいました・・・

悩む前に公式リファレンスなり確認した方がいいですね。

ここまでのまとめ

ここまでのことを簡単にまとめると次の通り

  • json_decodeでは Array が stdClass になることがある
  • それを防ぐためにはjson_decodeの第二引数にtrueを渡す

これからは第二引数も省略せずに使っていこうと思います。

ではでは( ̄▽ ̄)ノ~~

PHP

Commentsこの記事についたコメント

コメントを残す

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

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください