最初のオブジェクトを指す可能性のある配列を持つオブジェクトを持つ配列を持つオブジェクトなどで構成される複雑なデータ構造を送信しようとしています...そして、次のエラーが発生します: TypeError: 循環構造を JSONに変換していますなぜそれが起こるのか完全に理解しています。
処理にコストがかかりすぎるため、構造の平坦化を避けようとしていますので、http リクエストを送信する (PHP ページに送信する) ときにこのエラーを単純に無視できる他の方法があるかどうか疑問に思っています。
最初のオブジェクトを指す可能性のある配列を持つオブジェクトを持つ配列を持つオブジェクトなどで構成される複雑なデータ構造を送信しようとしています...そして、次のエラーが発生します: TypeError: 循環構造を JSONに変換していますなぜそれが起こるのか完全に理解しています。
処理にコストがかかりすぎるため、構造の平坦化を避けようとしていますので、http リクエストを送信する (PHP ページに送信する) ときにこのエラーを単純に無視できる他の方法があるかどうか疑問に思っています。
いいえ。JSON は基本的に JS 代入操作の右側です。自己参照 JS 構造を 1 行で構築することはできません。たとえば、次のようになります。
var x = {y : x };
x
左側で実際に作成される前に右側で使用すると、単に「未定義」エラーが吐き出されます。
JavaScript の 1 行で何かを表現できない場合、JSON で表現することはできません。
その円形構造をどこかで分割する必要があります。
PHP 5.4 から、JsonSerializable
から要求されたときにオブジェクトが JSON 表現に影響を与えることができるインターフェースが利用可能になりましたjson_encode()
。
したがって、これを参照先のオブジェクトに追加して、最初に要求されたときに子のみを返すことができる場合があります。または、このオブジェクトを参照するオブジェクトがそれを返すのではなく、それ以外のすべてを返すようにすることをお勧めします。
そのインターフェースを以前のバージョンの PHP に移植しようとすることもできますが、そのインターフェース (これは簡単です) だけでなく、json_encode()
インターフェースの存在を検出してすべての処理を行うための代替関数も必要になります。
->toJson()
相互に再帰的に呼び出す関数をオブジェクトに実装することもできます。
でエラーを抑えようとしたの@json_encode()
ではないでしょうか? エラーはなくなりますが、平らな円形構造の痛みはなくなりません。