使用PHP json_decode可能遇到的坑與解決方法
前言
最近在做網(wǎng)站 的時候用到了json_decode函數(shù),發(fā)現(xiàn)了一個問題,現(xiàn)在總結(jié)分享出來供大家參考學習,話不多說了,來一起看看詳細的介紹吧。
場景:
某項目客戶反饋,輸出的結(jié)果 JSON 中有個要求為對象的數(shù)據(jù)字段,在某些情況下返回的是 [] 而不是 {};數(shù)據(jù)由公司其他部門提供,查看原始數(shù)據(jù)的時候,沒有發(fā)現(xiàn)任何問題;后來因為要加入某些預處理,在獲取到其他部門的 JSON 數(shù)據(jù)之后進行解碼并對某個字段進行處理;然而,在處理完之后再次使用 JSON 輸出,發(fā)現(xiàn)結(jié)果已經(jīng)不是我們想要的了。
原始數(shù)據(jù)
{
...,
"foo": "",
"bar": {},
...
}
其中 foo 是我要進行處理的字段,處理完成之后再次使用 json_encode($data) 進行 JSON 編碼。
編碼完成之后的結(jié)果卻是這樣的
{
...,
"foo": "",
"bar": [],
...
}
空對象編程了空數(shù)組,而且我并沒有處理過字段 bar
通過對模擬數(shù)據(jù)的實測,發(fā)現(xiàn)是因為在對 JSON 進行解碼的時候,是這么解的
$data = json_decode($jsonString, true)
問題就出在這里,由于 PHP 自身的特性,在 PHP 中 array 是可以代表強類型語言,如 Java 中的 List 和 Map 的。
來看 PHP 中 json_decode() 方法是如何定義的
mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )
來源 http://php.net/manual/zh/function.json-decode.php
當?shù)诙€參數(shù) $assoc 為 true 時,返回的類型是 array,所以問題就來了,當 JSON 中空對象 {} 和 [] 空數(shù)組,使用這種方式解碼出來的結(jié)果表現(xiàn)是一致的;即 array();當再次 json_encode() 編碼的時候就出現(xiàn)了 {} 變 [] 了。
所以正確的做法是在解碼 JSON 的時候 json_decode 不要傳遞第二個參數(shù);讓解碼結(jié)果是一個對象,然后操作對象的屬性,操作完成之后再次編碼就不會出現(xiàn)偏差。
這種問題最突出在于強類型語言和弱類型語言的 API 對接上,由于項目的下家是使用 Java 語言,所以導致了 BUG
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
PHP實現(xiàn)數(shù)字補零功能的2個函數(shù)介紹
這篇文章主要介紹了PHP實現(xiàn)數(shù)字補零功能的2個函數(shù)介紹,需要的朋友可以參考下2014-05-05
php中使用array_filter()函數(shù)過濾數(shù)組實例講解
在本篇文章里小編給大家分享的是一篇關(guān)于php中使用array_filter()函數(shù)過濾數(shù)組實例講解,有興趣的朋友們可以學習下。2021-03-03
PHP實現(xiàn)的數(shù)據(jù)對象映射模式詳解
這篇文章主要介紹了PHP實現(xiàn)的數(shù)據(jù)對象映射模式,結(jié)合實例形式分析了php數(shù)據(jù)對象映射模式的原理、實現(xiàn)步驟及相關(guān)操作技巧,需要的朋友可以參考下2019-03-03

