在PHP開發(fā)中,使用json進行數(shù)據(jù)傳輸和存儲是非常常見的。但是在一些特殊情況下,會出現(xiàn)循環(huán)引用的情況,這會導(dǎo)致json編碼出現(xiàn)問題。例如:
$parent = ["name" => "parent"]; $child = ["name" => "child", "parent" => &$parent]; $parent["child"] = $child; echo json_encode($parent);
輸出結(jié)果為:
PHP Fatal error: Allowed memory size of xxx bytes exhausted (tried to allocate xxx bytes)
這是因為$parent和$child相互引用,造成死循環(huán),導(dǎo)致內(nèi)存溢出。
為解決這個問題,可以使用PHP的json擴展包提供的特性,進行消除循環(huán)引用的處理。例如:
$parent = ["name" => "parent"]; $child = ["name" => "child"]; $child["parent"] = &$parent; $parent["child"] = &$child; echo json_encode($parent, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_PARTIAL_OUTPUT_ON_ERROR);
輸出結(jié)果為:
{ "name": "parent", "child": { "name": "child" } }
在json_encode函數(shù)中,使用了以下特性:
- JSON_UNESCAPED_UNICODE:不進行Unicode轉(zhuǎn)義,這樣輸出的結(jié)果更易讀。
- JSON_UNESCAPED_SLASHES:不進行斜杠轉(zhuǎn)義。
- JSON_PRETTY_PRINT:對數(shù)組進行格式化,輸出的結(jié)果更易讀。
- JSON_PARTIAL_OUTPUT_ON_ERROR:在編碼過程中如果發(fā)生錯誤,只輸出已經(jīng)編碼的部分數(shù)據(jù),而不是直接拋出異常。
當(dāng)然,還有其他的方式解決循環(huán)引用問題,例如使用引用計數(shù),但是這種方式需要自己實現(xiàn)相關(guān)功能,比較麻煩。而使用json擴展包提供的特性,可以輕松解決問題。