16.3. JSON オブジェクト

PHP オブジェクトを JSON にエンコードすると、 オブジェクトの public プロパティがすべて JSON オブジェクトにエンコードされます。

JSON はオブジェクトへの参照を扱うことができません。 再帰的な参照を伴うオブジェクトをエンコードしないように気をつけましょう。 再帰に関する問題が発生しないよう、 Zend_Json::encode() および Zend_Json_Encoder::encode() のオプションの二番目のパラメータで再帰をチェックすることができます。 オブジェクトが二度シリアライズされると、例外がスローされるようになります。

JSON オブジェクトのデコードは、さらに大変です。Javascript のオブジェクトを PHP に対応させるなら、連想配列にするのが一番近いでしょう。 しかし、中には「クラスの ID を渡してそのインスタンスを作成し、 JSON オブジェクトの キー/値 をそのインスタンスに代入すべきだという人もいます。 また、そんなことをするとセキュリティ上問題があるという人もいるでしょう。

デフォルトでは、Zend_Json は JSON オブジェクトを連想配列にデコードします。しかし、 もしオブジェクトとして受け取りたいのなら、そのように指定することもできます。

<?php
// オブジェクトをオブジェクトにデコードします
$phpNative = Zend_Json::decode($encodedValue, Zend_Json::TYPE_OBJECT);
?>

このようにしてデコードされたオブジェクトは StdClass オブジェクトとなり、JSON の キー/値 のペアに対応するプロパティを保持します。

Zend Framework の推奨する方法は、各開発者が JSON オブジェクトのデコード方法を決めるべきだというものです。 もし特定の型のオブジェクトを返してほしいのなら、 お望みの型のオブジェクトを開発者自身が作成したうえで、 Zend_Json がデコードした値をそこに代入していけばいいのです。