使用PHP json_decode可能遇到的坑與解決方法
前言
最近在做網(wǎng)站 的時(shí)候用到了json_decode函數(shù),發(fā)現(xiàn)了一個(gè)問(wèn)題,現(xiàn)在總結(jié)分享出來(lái)供大家參考學(xué)習(xí),話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧。
場(chǎng)景:
某項(xiàng)目客戶反饋,輸出的結(jié)果 JSON 中有個(gè)要求為對(duì)象的數(shù)據(jù)字段,在某些情況下返回的是 [] 而不是 {};數(shù)據(jù)由公司其他部門(mén)提供,查看原始數(shù)據(jù)的時(shí)候,沒(méi)有發(fā)現(xiàn)任何問(wèn)題;后來(lái)因?yàn)橐尤肽承╊A(yù)處理,在獲取到其他部門(mén)的 JSON 數(shù)據(jù)之后進(jìn)行解碼并對(duì)某個(gè)字段進(jìn)行處理;然而,在處理完之后再次使用 JSON 輸出,發(fā)現(xiàn)結(jié)果已經(jīng)不是我們想要的了。
原始數(shù)據(jù)
{ ..., "foo": "", "bar": {}, ... }
其中 foo 是我要進(jìn)行處理的字段,處理完成之后再次使用 json_encode($data)
進(jìn)行 JSON 編碼。
編碼完成之后的結(jié)果卻是這樣的
{ ..., "foo": "", "bar": [], ... }
空對(duì)象編程了空數(shù)組,而且我并沒(méi)有處理過(guò)字段 bar
通過(guò)對(duì)模擬數(shù)據(jù)的實(shí)測(cè),發(fā)現(xiàn)是因?yàn)樵趯?duì) JSON 進(jìn)行解碼的時(shí)候,是這么解的
$data = json_decode($jsonString, true)
問(wèn)題就出在這里,由于 PHP 自身的特性,在 PHP 中 array 是可以代表強(qiáng)類(lèi)型語(yǔ)言,如 Java 中的 List 和 Map 的。
來(lái)看 PHP 中 json_decode()
方法是如何定義的
mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )
來(lái)源 http://php.net/manual/zh/function.json-decode.php
當(dāng)?shù)诙€(gè)參數(shù) $assoc
為 true 時(shí),返回的類(lèi)型是 array,所以問(wèn)題就來(lái)了,當(dāng) JSON 中空對(duì)象 {} 和 [] 空數(shù)組,使用這種方式解碼出來(lái)的結(jié)果表現(xiàn)是一致的;即 array();
當(dāng)再次 json_encode()
編碼的時(shí)候就出現(xiàn)了 {} 變 [] 了。
所以正確的做法是在解碼 JSON 的時(shí)候 json_decode 不要傳遞第二個(gè)參數(shù);讓解碼結(jié)果是一個(gè)對(duì)象,然后操作對(duì)象的屬性,操作完成之后再次編碼就不會(huì)出現(xiàn)偏差。
這種問(wèn)題最突出在于強(qiáng)類(lèi)型語(yǔ)言和弱類(lèi)型語(yǔ)言的 API 對(duì)接上,由于項(xiàng)目的下家是使用 Java 語(yǔ)言,所以導(dǎo)致了 BUG
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- JavaScript字符串轉(zhuǎn)數(shù)字的5種方法及遇到的坑
- 基于js粘貼事件paste簡(jiǎn)單解析以及遇到的坑
- JavaScript代碼編寫(xiě)中各種各樣的坑和填坑方法
- JavaScript中使用typeof運(yùn)算符需要注意的幾個(gè)坑
- Javascript中構(gòu)造函數(shù)要注意的一些坑
- JS大坑之19位數(shù)的Number型精度丟失問(wèn)題詳解
- JS面試題大坑之隱式類(lèi)型轉(zhuǎn)換實(shí)例代碼
- 對(duì)象題目的一個(gè)坑 理解Javascript對(duì)象
- 弱類(lèi)型語(yǔ)言javascript開(kāi)發(fā)中的一些坑實(shí)例小結(jié)【變量、函數(shù)、數(shù)組、對(duì)象、作用域等】
相關(guān)文章
php強(qiáng)制下載類(lèi)型的實(shí)現(xiàn)代碼
有時(shí)需要一些文件不能在線打開(kāi),而是執(zhí)行后需要下載,這時(shí)就用這個(gè)函數(shù)就可以解決了2011-04-04ADODB結(jié)合SMARTY使用~超級(jí)強(qiáng)
ADODB結(jié)合SMARTY使用~超級(jí)強(qiáng)...2006-11-11Win2003下IIS+PHP+MySQL+Zend配置步驟詳解
Win2003下IIS+PHP+MySQL+Zend配置步驟詳解...2007-05-05php提交表單時(shí)判斷 if($_POST[submit])與 if(isset($_POST[submit])) 的區(qū)別
if(isset($_POST['submit'])) 它的意思是不是判斷是否配置了$_POST['submit'] 這個(gè)變量呢? 如果有這個(gè)變量 在執(zhí)行其它代碼2011-02-02php array_filter除去數(shù)組中的空字符元素
php array_filter除去數(shù)組中的空字符元素,array_filter() 函數(shù)根據(jù)回調(diào)函數(shù)過(guò)濾數(shù)組中的值,省略回調(diào)函數(shù)則默認(rèn)過(guò)濾空值,需要的朋友可以參考下。2011-11-11