PHP 8.0.0 Released!

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($jsontrue));

?>

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

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(
        
=> 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(43, -1) as $depth) {
    
var_dump(json_decode($jsontrue$depth));
    echo 
'Last error: '$json_errors[json_last_error()], PHP_EOLPHP_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($jsonfalse512JSON_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() を使用すればエラーの正確な状態を知ることができます。

参考

add a note add a note

User Contributed Notes 1 note

up
1
cubefox at web dot NOSPAMPLEASE dot de
19 days ago
Warning: As the section "return values" mentions, the return value NULL is ambiguos. To repeat, it can mean three things:

* The input string had the value "null"
* There was an error while parsing the input data
* The encoded data was deeper than the recursion limit

To distinguish these cases, json_last_error() can be used.
To Top