JSON の入出力
JsonCodec の概要
このモジュールには JSON 入出力用の Codec として Peach_DF_JsonCodec クラスが用意されています.
この Codec は PHP5.1.1 以上のすべてのバージョンで json_encode(), json_decode() と同等の機能を利用できるようにするためのものです.
使い方およびサンプル
JsonCodec は以下のように使用します.
- コンストラクタ引数にエンコードオプション・デコードオプションを指定して JsonCodec オブジェクトを生成します
- 生成した JsonCodec オブジェクトの encode() または decode() メソッドを実行し, 任意の値の JSON 文字列への変換または JSON 文字列から値への変換を行います.
encode() のサンプル
以下に encode() のサンプルコードを掲載します.
- $encodeOptions = array(
- );
- echo $codec->encode(array("a" => 2.0, "b" => 3.14, "c" => "テスト"));
- /*
- output:
- {
- "a": 2.0,
- "b": 3.14,
- "c": "テスト"
- }
- */
このコードは, json_encode() を用いた以下のコードと等価です.
- $encodeOptions =
- JSON_PRETTY_PRINT |
- JSON_PRESERVE_ZERO_FRACTION |
- JSON_UNESCAPED_UNICODE;
- /*
- output:
- {
- "a": 2.0,
- "b": 3.14,
- "c": "テスト"
- }
- */
ただし, JsonCodec を使った前者のサンプルが PHP 5.1.1 以上のすべてのバージョンで動作するのに対し, json_encode() を使った後者のコードは PHP 5.6.6 以上でないと動作しません. (それより前のバージョンが JSON_PRESERVE_ZERO_FRACTION をサポートしていないため)
json_encode() の各オプションを活用しつつ, できるだけ幅広いバージョンで動作させたい場合は json_encode() の代わりに JsonCodec を使うことをおすすめします.
decode() のサンプル
decode() の結果をカスタマイズするには, 以下のように第 2 引数にオプションを指定します.
- $json = <<<EOS
- {
- "a": "test",
- "b": 12345678901234567890,
- "c": [100, 200, 300]
- }
- EOS;
- $decodeOptions = array(
- );
- /*
- output:
- array(3) {
- ["a"]=>
- string(4) "test"
- ["b"]=>
- string(20) "12345678901234567890"
- ["c"]=>
- array(3) {
- [0]=>
- int(100)
- [1]=>
- int(200)
- [2]=>
- int(300)
- }
- }
- */
このコードは, json_decode() を用いた以下のコードとほぼ等価です. (ただし JsonCodec にはネストの深さを指定するオプションがありません)
- $json = <<<EOS
- {
- "a": "test",
- "b": 12345678901234567890,
- "c": [100, 200, 300]
- }
- EOS;
- $decodeOptions = JSON_BIGINT_AS_STRING;
- /*
- output:
- array(3) {
- 'a' =>
- string(4) "test"
- 'b' =>
- string(20) "12345678901234567890"
- 'c' =>
- array(3) {
- [0] =>
- int(100)
- [1] =>
- int(200)
- [2] =>
- int(300)
- }
- }
- */
さきほどと同様, JsonCodec を使った前者の例では PHP 5.1.1 以上のすべてのバージョンで動作しますが, json_decode() を使ったコードは PHP 5.4.0 以上でないとエラーとなります.
オプションの指定方法
コンストラクタ引数のオプションの形式は, 以下の 2 通りがあります.
配列
サンプルコードにあるように, キーにオプション定数・値に ON/OFF をあらわす bool 型の値を取るような配列を指定します.
整数
json_encode() のオプション引数のように, 各定数のビットマスクによる整数も受付けます.
以下のコードにおける 2 種類の JsonCodec ($c1, $c2) は等価なオブジェクトとなります.
- $encodeOptions = array(
- );
- $decodeOptions = array(
- );
- Prev: UTF-8 文字列を取り扱う
- Next: 複数の Codec を連結させる