Jsonを気軽に扱えるようになるクラス…ではなく、XMLからJsonに変換するクラスです。
なにしろPHPにはjson_decodeという便利極まりない関数がデフォルト装備されているので、単にJsonを扱うだけのクラスはぶっちゃけ不要なんですよね。
簡単ですね。
ただしJsonからXMLに戻すことができないという片手落ちです。なんでだ。
Zend\Json\Jsonと同じ場所にZend\Json\Encoder、Decoderクラスがあり、一見これを使ってエンコードデコードしているように見えますが、実はjson_encodeが存在すればそれを使ってエンコードしています。
json_encodeが存在しない場合のみZend\Json\Encoderを使って自力でエンコードします。
ところでZF2.0の最低要求バージョンはPHP5.3であり、json_encode()はPHP5.2からPHPコアに含まれ標準インストールされます。
つまりZend\Json\Encoder/Decoderクラスは死にクラス。
ちなみにJson::encode()に配列ではなくインスタンスを渡した場合、そのクラスにtoJson()メソッドがあればそちらを呼んで返してくれるといった隠し機能もありますが、直接読んだ方が早いので出番はありません。
なにしろPHPにはjson_decodeという便利極まりない関数がデフォルト装備されているので、単にJsonを扱うだけのクラスはぶっちゃけ不要なんですよね。
<?php
require_once('channel/vendor/autoload.php');
$array = array('foo'=>'bar', 1=>2);
$xml= '<書籍目録> <書名>XML入門</書名> <著者>筒井</著者> <書名>続・XML入門</書名> <著者>小松</著者> </書籍目録>';
//エンコード
$json = Zend\Json\Json::encode($array);
//デコード
$stdClass = Zend\Json\Json::decode($json);
// JSONの整形
$jsonPritty = Zend\Json\Json::prettyPrint($json, array("indent" => " "));
// XMLからJsonに
$jsonXml = Zend\Json\Json::fromXml($xml);
$stdClassXml = Zend\Json\Json::decode($jsonXml);
var_dump($json, $stdClass, $jsonXml, $stdClassXml);
結果。
string(19) "{"foo":"bar","1":2}"
object(stdClass)#2 (2) {
["foo"]=>
string(3) "bar"
["1"]=>
int(2)
}
string(142) "{"\u66f8\u7c4d\u76ee\u9332":{"\u66f8\u540d":["XML\u5165\u9580","\u7d9a\u30fbXML\u5165\u9580"],"\u8457\u8005":["\u7b52\u4e95","\u5c0f\u677e"]}}"
object(stdClass)#3 (1) {
["書籍目録"]=>
object(stdClass)#7 (2) {
["書名"]=>
array(2) {
[0]=>
string(9) "XML入門"
[1]=>
string(15) "続・XML入門"
}
["著者"]=>
array(2) {
[0]=>
string(6) "筒井"
[1]=>
string(6) "小松"
}
}
}
めでたくJsonに変換、およびJsonから元に戻すことができました。簡単ですね。
ただしJsonからXMLに戻すことができないという片手落ちです。なんでだ。
Zend\Json\Jsonと同じ場所にZend\Json\Encoder、Decoderクラスがあり、一見これを使ってエンコードデコードしているように見えますが、実はjson_encodeが存在すればそれを使ってエンコードしています。
json_encodeが存在しない場合のみZend\Json\Encoderを使って自力でエンコードします。
ところでZF2.0の最低要求バージョンはPHP5.3であり、json_encode()はPHP5.2からPHPコアに含まれ標準インストールされます。
つまりZend\Json\Encoder/Decoderクラスは死にクラス。
Zend\Json\Json::$useBuiltinEncoderDecoder = true;とするとjson_encode()を使わないようにできますが、ネイティブ関数を拒否してあえて再発明をする理由も見当たらず、存在意義は不明です。
ちなみにJson::encode()に配列ではなくインスタンスを渡した場合、そのクラスにtoJson()メソッドがあればそちらを呼んで返してくれるといった隠し機能もありますが、直接読んだ方が早いので出番はありません。
PR