json_decode関数:JSON文字列を配列やオブジェクトに変換する

JSON形式については前回の投稿でご説明していますので省略します。

前回ご紹介したjson_encode関数に引き続き、今度はJSON形式の文字列を元のオブジェクトに変換する(デコードする)ための関数をご紹介します。

json_encode関数とjson_decode関数の使い方を覚えれば、PHPでJSON形式を扱うのはお手の物です。きっと。

使い方

$object = json_decode( $json_text );

使い方はいたってシンプルかつ簡単です。引数にJSON形式の文字列を渡せばいいのです。

ところが、この関数にはちょっとした落とし穴がありますので、実際に使う際には注意が必要です。
まずは、指定可能な引数をご紹介します。

指定可能な引数

この関数は第1引数以外にも指定が可能です。

説明
第1引数 文字列 JSON形式の文字列
第2引数
(省略可)
論理値 true: 連想配列形式に変換します。
false:オブジェクト形式に変換します。(省略時のデフォルト値)
第3引数
(省略可)
数値 配列やオブジェクトの階層の深さ。デフォルト:512
第4引数
(省略可)
定数 デコード時のオプションを示す定数。
第4引数で指定可能な定数
定数 説明
JSON_BIGINT_AS_STRING 大きな整数を文字列に変換する。指定しない場合は大きな整数が浮動小数点数型に変換されてしまうので丸め誤差が生じるかも。

落とし穴

json_decode関数では、JSON形式の文字列をデコードできなかった場合、戻り値としてNULLが返ります。
ところが、”null”というJSON文字列を渡してもNULLが戻り値として返るのです。

では、デコードできなかった場合をどうやって判断するのかというと、json_last_error関数を使います。
json_last_error関数は、json_decodeやjson_encodeの関数呼び出し時に発生したエラーコードを返してくれる関数です。
なお、PHP5.5以上ではjson_last_error_msg関数も加わり、エラーメッセージを文字列で取得することもできます。

実際に、次のサンプルプログラムで使い方をご覧ください。

サンプルプログラム

<?php
$json_text = '{"name":"Earth","radius":6356.752314,"surface_area":510065600,"atmosphere":["nitrogen","oxygen","argon","carbon dioxide"]}';

$decoded = json_decode($json_text);

if (json_last_error() === JSON_ERROR_NONE) {
    echo "デコード成功: ".PHP_EOL;
    var_dump($decoded);
}
else {
    echo "デコード失敗: ".PHP_EOL;
    echo "エラーコード: ".json_last_error().PHP_EOL;
    // PHP 5.5以上はこちらがわかりやすい
    // echo "エラーメッセージ: ".json_last_error_msg().PHP_EOL;
}

実行結果

デコード成功:
object(stdClass)#1 (4) {
  ["name"]=>
  string(5) "Earth"
  ["radius"]=>
  float(6356.752314)
  ["surface_area"]=>
  int(510065600)
  ["atmosphere"]=>
  array(4) {
    [0]=>
    string(8) "nitrogen"
    [1]=>
    string(6) "oxygen"
    [2]=>
    string(5) "argon"
    [3]=>
    string(14) "carbon dioxide"
  }
}

デコード失敗時の例

デコード失敗:
エラーコード: 4
エラーメッセージ: null expected

json_last_error関数の戻り値

json_last_error関数では戻り値に以下の定数の値が返されますので、この定数を使って比較することができます。

定数 説明
JSON_ERROR_NONE エラーなし
JSON_ERROR_DEPTH 階層の深さ指定を超えている。
JSON_ERROR_STATE_MISMATCH JSON形式が途中で壊れている。
JSON_ERROR_CTRL_CHAR 不正な制御文字が含まれている。(おそらく文字エンコードが違う)
JSON_ERROR_SYNTAX JSON形式の構文エラー。
JSON_ERROR_UTF8 不正なUTF-8文字が含まれている。
JSON_ERROR_RECURSION エンコード時に再帰参照が含まれている。(PHP 5.5以上)
JSON_ERROR_INF_OR_NAN デコード文字列にNaN(非数)やinfinity(無限大)が含まれている。(PHP 5.5以上)
JSON_ERROR_UNSUPPORTED_TYPE エンコード不可能な型が含まれている。(PHP 5.5以上)

使いどころ

落とし穴さえ気を付けていれば、とても便利な関数です。

JSON形式のメッセージを扱うAPIなどを使う際には、とても簡単に実装できると思いますので、うまく活用してください。

公式サイト

http://php.net/manual/ja/function.json-decode.php
http://php.net/manual/ja/function.json-last-error.php
http://php.net/manual/ja/function.json-last-error-msg.php

コメントを残す

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

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>