Php/docs/function.json-decode

提供:Dev Guides
< Php
移動先:案内検索

json_decode

(PHP 5 >= 5.2.0, PHP 7, PECL json >= 1.2.0)

json_decodeJSON 文字列をデコードする


説明

json_decode ( string $json [, bool|null $associative = null [, int $depth = 512 [, int $flags = 0 ]]] ) : mixed

JSON エンコードされた文字列を受け取り、それを PHP の変数に変換します。


パラメータ

json

デコード対象となる json 文字列。

この関数は UTF-8 でエンコードされた文字列でのみ動作します。

注意:

PHP の実装は、 » RFC 7159 の JSON のスーパーセットです。

associative

true の場合、返されるオブジェクトは連想配列形式になります。 false の場合、返されるオブジェクトは object になります。 null の場合、返されるオブジェクトは flagsJSON_OBJECT_AS_ARRAY が設定されているかどうかによって、 連想配列形式か object かが変化します。

depth

ユーザー指定の再帰の深さ。

flags

JSON_BIGINT_AS_STRING, JSON_INVALID_UTF8_IGNORE, JSON_INVALID_UTF8_SUBSTITUTE, JSON_OBJECT_AS_ARRAY, JSON_THROW_ON_ERROR. からなるビットマスク。 各定数の意味については JSON 定数のページ に説明があります。


返り値

json でエンコードされたデータを、適切な PHP の型として返します。 truefalse および null はそれぞれ truefalse そして null として返されます。 json のデコードに失敗したり エンコードされたデータが再帰制限を超えているなどの場合、null を返します。


変更履歴

バージョン 説明
7.3.0 flags パラメータに

JSON_THROW_ON_ERROR が追加されました。

7.2.0 associative は nullable になりました。
7.2.0 flags パラメータに

JSON_INVALID_UTF8_IGNORE および JSON_INVALID_UTF8_SUBSTITUTE が追加されました。

7.1.0 空の JSONキー ("") は、

_empty_ というキーではなく、 空のオブジェクトプロパティにエンコードされるようになりました。


例1 json_decode() の例

<?php$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';var_dump(json_decode($json));var_dump(json_decode($json, true));?>

上の例の出力は以下となります。


object(stdClass)#1 (5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

array(5) {
    ["a"] => int(1)
    ["b"] => int(2)
    ["c"] => int(3)
    ["d"] => int(4)
    ["e"] => int(5)
}

例2 無効なオブジェクトプロパティへのアクセス

オブジェクトの中にある、 PHP の命名規約では使えない文字 (ハイフンなど) を含む要素にアクセスするには、 要素名を波括弧とアポストロフィで囲みます。


<?php$json = '{"foo-bar": 12345}';$obj = json_decode($json);print $obj->{'foo-bar'}; // 12345?>

例3 json_decode() でのありがちな間違い

<?php// 以下の文字列は JavaScript としては有効ですが JSON としては無効です// 名前と値はダブルクォートで囲む必要があります。// シングルクォートは使えません$bad_json = "{ 'bar': 'baz' }";json_decode($bad_json); // null// 名前をダブルクォートで囲まなければなりません$bad_json = '{ bar: "baz" }';json_decode($bad_json); // null// 最後にカンマをつけてはいけません$bad_json = '{ bar: "baz", }';json_decode($bad_json); // null?>

例4 depth エラー

<?php// データをエンコードします$json = json_encode(    array(        1 => array(            'English' => array(                'One',                'January'            ),            'French' => array(                'Une',                'Janvier'            )        )    ));// エラーを定義します$constants = get_defined_constants(true);$json_errors = array();foreach ($constants["json"] as $name => $value) {    if (!strncmp($name, "JSON_ERROR_", 11)) {        $json_errors[$value] = $name;    }}// さまざまな深さのエラーを表示しますforeach (range(4, 3, -1) as $depth) {    var_dump(json_decode($json, true, $depth));    echo 'Last error: ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;}?>

上の例の出力は以下となります。


array(1) {
  [1]=>
  array(2) {
    ["English"]=>
    array(2) {
      [0]=>
      string(3) "One"
      [1]=>
      string(7) "January"
    }
    ["French"]=>
    array(2) {
      [0]=>
      string(3) "Une"
      [1]=>
      string(7) "Janvier"
    }
  }
}
Last error: JSON_ERROR_NONE

NULL
Last error: JSON_ERROR_DEPTH

例5 json_decode() で大きな整数値を扱う例

<?php$json = '{"number": 12345678901234567890}';var_dump(json_decode($json));var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));?>

上の例の出力は以下となります。


object(stdClass)#1 (1) {
  ["number"]=>
  float(1.2345678901235E+19)
}
object(stdClass)#1 (1) {
  ["number"]=>
  string(20) "12345678901234567890"
}

注意

注意:

JSON の仕様は JavaScript そのものではなく、JavaScript のサブセットです。

注意:

デコードに失敗した場合は、json_last_error() を使用すればエラーの正確な状態を知ることができます。

参考