DF

JSON の入出力

Author : trashtoy

Table of Contents

JsonCodec の概要

このモジュールには JSON 入出力用の Codec として Peach_DF_JsonCodec クラスが用意されています.

この Codec は PHP5.1.1 以上のすべてのバージョンで json_encode(), json_decode() と同等の機能を利用できるようにするためのものです.

使い方およびサンプル

JsonCodec は以下のように使用します.

  1. コンストラクタ引数にエンコードオプション・デコードオプションを指定して JsonCodec オブジェクトを生成します
  2. 生成した JsonCodec オブジェクトの encode() または decode() メソッドを実行し, 任意の値の JSON 文字列への変換または JSON 文字列から値への変換を行います.

encode() のサンプル

以下に encode() のサンプルコードを掲載します.

  1. $encodeOptions array(
  2.     Peach_DF_JsonCodec::PRETTY_PRINT => true,
  3.     Peach_DF_JsonCodec::PRESERVE_ZERO_FRACTION => true,
  4.     Peach_DF_JsonCodec::UNESCAPED_UNICODE => true,
  5. );
  6. $codec  new Peach_DF_JsonCodec($encodeOptions);
  7. echo $codec->encode(array("a" => 2.0"b" => 3.14"c" => "テスト"));
  8.  
  9. /*
  10. output:
  11. {
  12.     "a": 2.0,
  13.     "b": 3.14,
  14.     "c": "テスト"
  15. }
  16.  */

このコードは, json_encode() を用いた以下のコードと等価です.

  1. $encodeOptions =
  2.     JSON_PRETTY_PRINT |
  3.     JSON_PRESERVE_ZERO_FRACTION |
  4.     JSON_UNESCAPED_UNICODE;
  5. echo json_encode(array("a" => 2.0"b" => 3.14"c" => "テスト")$encodeOptions);
  6.  
  7. /*
  8. output:
  9. {
  10.     "a": 2.0,
  11.     "b": 3.14,
  12.     "c": "テスト"
  13. }
  14.  */

ただし, JsonCodec を使った前者のサンプルが PHP 5.1.1 以上のすべてのバージョンで動作するのに対し, json_encode() を使った後者のコードは PHP 5.6.6 以上でないと動作しません. (それより前のバージョンが JSON_PRESERVE_ZERO_FRACTION をサポートしていないため)

json_encode() の各オプションを活用しつつ, できるだけ幅広いバージョンで動作させたい場合は json_encode() の代わりに JsonCodec を使うことをおすすめします.

decode() のサンプル

decode() の結果をカスタマイズするには, 以下のように第 2 引数にオプションを指定します.

  1. $json = <<<EOS
  2. {
  3.     "a": "test",
  4.     "b": 12345678901234567890,
  5.     "c": [100, 200, 300]
  6. }
  7. EOS;
  8.  
  9. $decodeOptions array(
  10.     Peach_DF_JsonCodec::OBJECT_AS_ARRAY => true,
  11.     Peach_DF_JsonCodec::BIGINT_AS_STRING => true,
  12. );
  13. $codec new Peach_DF_JsonCodec(array()$decodeOptions);
  14. var_dump($codec->decode($json));
  15.  
  16. /*
  17. output:
  18. array(3) {
  19.   ["a"]=>
  20.   string(4) "test"
  21.   ["b"]=>
  22.   string(20) "12345678901234567890"
  23.   ["c"]=>
  24.   array(3) {
  25.     [0]=>
  26.     int(100)
  27.     [1]=>
  28.     int(200)
  29.     [2]=>
  30.     int(300)
  31.   }
  32. }
  33.  */

このコードは, json_decode() を用いた以下のコードとほぼ等価です. (ただし JsonCodec にはネストの深さを指定するオプションがありません)

  1. $json = <<<EOS
  2. {
  3.     "a": "test",
  4.     "b": 12345678901234567890,
  5.     "c": [100, 200, 300]
  6. }
  7. EOS;
  8.  
  9. $decodeOptions JSON_BIGINT_AS_STRING;
  10. var_dump(json_decode($jsontrue512$decodeOptions));
  11.  
  12. /*
  13. output:
  14. array(3) {
  15.   'a' =>
  16.   string(4) "test"
  17.   'b' =>
  18.   string(20) "12345678901234567890"
  19.   'c' =>
  20.   array(3) {
  21.     [0] =>
  22.     int(100)
  23.     [1] =>
  24.     int(200)
  25.     [2] =>
  26.     int(300)
  27.   }
  28. }
  29. */

さきほどと同様, JsonCodec を使った前者の例では PHP 5.1.1 以上のすべてのバージョンで動作しますが, json_decode() を使ったコードは PHP 5.4.0 以上でないとエラーとなります.

オプションの指定方法

コンストラクタ引数のオプションの形式は, 以下の 2 通りがあります.

配列

サンプルコードにあるように, キーにオプション定数・値に ON/OFF をあらわす bool 型の値を取るような配列を指定します.

整数

json_encode() のオプション引数のように, 各定数のビットマスクによる整数も受付けます.

以下のコードにおける 2 種類の JsonCodec ($c1, $c2) は等価なオブジェクトとなります.

  1. $encodeOptions array(
  2.     Peach_DF_JsonCodec::PRETTY_PRINT => true,
  3.     Peach_DF_JsonCodec::PRESERVE_ZERO_FRACTION => true,
  4.     Peach_DF_JsonCodec::UNESCAPED_UNICODE => true,
  5. );
  6. $decodeOptions array(
  7.     Peach_DF_JsonCodec::OBJECT_AS_ARRAY => true,
  8.     Peach_DF_JsonCodec::BIGINT_AS_STRING => true,
  9. );
  10. $c1 new Peach_DF_JsonCodec($encodeOptions$decodeOptions);
  11.  
  12. $opt1 Peach_DF_JsonCodec::PRETTY_PRINT |
  13.         Peach_DF_JsonCodec::PRESERVE_ZERO_FRACTION |
  14.         Peach_DF_JsonCodec::UNESCAPED_UNICODE;
  15. $opt2 Peach_DF_JsonCodec::OBJECT_AS_ARRAY Peach_DF_JsonCodec::BIGINT_AS_STRING;
  16. $c2 new Peach_DF_JsonCodec($opt1$opt2);