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以降 |
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
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' }; |