JSON

エンコード (PHP変数 → JSON文字列)

json_encode()

PHP 5.2.0以降であれば、json_encode()で簡単にJSON形式のデータを生成できます。

string json_encode (
    mixed $value        // 変換する値
    [, int $options = 0 // 変換オプション
    ] )
PHP: json_encode - Manual

$valueに含まれる文字列は、UTF-8でなければなりません。さもなくばInvalid UTF-8 sequence in argumentと警告されます。

変換オプションの$optionsには、次の値を指定できます。

定数 作用 対応
JSON_HEX_QUOT "を、\u0022に変換  
JSON_HEX_TAG <と>を、\u003Cと\u003Eに変換  
JSON_HEX_AMP &を、\u0026に変換  
JSON_HEX_APOS 'を、\u0027に変換  
JSON_NUMERIC_CHECK 数値形式の文字列を、クォートで囲まず出力 PHP 5.3.3以降
JSON_PRETTY_PRINT スペースやインデントで結果を整えて出力 PHP 5.4.0以降
JSON_UNESCAPED_SLASHES /を、エスケープしない PHP 5.4.0以降
JSON_FORCE_OBJECT 連想配列ではないとき、配列ではなくオブジェクトで出力  
JSON_UNESCAPED_UNICODE Unicode文字を\uXXXXにエスケープせず、そのまま出力 PHP 5.4.0以降
PHP: 定義済み定数 - Manual

JSONで出力を行うときには、それがJSONであることをheader()で明示します。

header( 'Content-Type: application/json' );
echo json_encode( $value );

変換例

echo json_encode( 5 );     // 5
echo json_encode( 'x' );   // "x"
echo json_encode( 'あ' );  // "\u3042"
echo json_encode( true );  // true

echo json_encode( NULL );  // null
echo json_encode( $a );    // null (未定義の変数)

echo json_encode( array( 5, 'x' ) );         // [5,"x"]
echo json_encode( array( 1=>5, 'a'=>'x' ) ); // {"1":5,"a":"x"}

echo json_encode(
    array( 1=>array( 5, 6 ), 2=>array( 'a'=>'x' ) ) );
    // {"1":[5,6],"2":{"a":"x"}}
echo json_encode( '<script>', JSON_HEX_TAG );                      // \u003Cscript\u003E
echo json_encode( '<あ>', JSON_HEX_TAG | JSON_UNESCAPED_UNICODE ); // \u003Cあ\u003E

デコード (JSON文字列 → PHP変数)

json_decode()

mixed json_decode (
    string $json           // 変換する文字列
    [, bool $assoc = false // TRUEならば、結果が連想配列形式で返される
    [, int $depth = 512    // 再帰する深さ
    [, int $options = 0    // デコードのオプション
    ]]] )
PHP: json_decode - Manual

JSON文字列が配列を表すならば配列、オブジェクトならばオブジェクトのように、PHPの型に変換されて返されます。デコードに失敗した場合にはNULLが返されますが、NULLをデコードした場合もNULLとなります。

print_r( json_decode( '[1,2]' ) );
// Array ( [0] => 1 [1] => 2 )

print_r( json_decode( '{"a":1,"b":2}' ) );
// stdClass Object ( [a] => 1 [b] => 2 )

JSONでは、オブジェクトのプロパティ名や文字列はダブルクォート ( " ) で囲まなければなりません。よって引数の文字列をシングルクォートで囲むか、さもなくばダブルクォートをエスケープします。

json_decode( "{'a':1}" );  // 変換に失敗する
json_decode( '{"a":1}' );
json_decode( "{\"a\":1}" );

要素へのアクセス方法

たとえば、

'{"arr":[1,2],"obj":{"a":0},"10":5}'

の文字列をデコードすると、

stdClass Object
(
    [arr] => Array
        (
            [0] => 1
            [1] => 2
        )

    [obj] => stdClass Object
        (
            [a] => 0
        )

    [10] => 5
)

の形式のオブジェクトが返されます。このとき結果が$resultに格納されているとすると、個々の要素へは下表のようにアクセスできます。

要素 サンプルコード
arrの最初の要素
$result->arr[0];
objの要素a
$result->obj->a;
プロパティ10
$result->{ '10' };