歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

PHP json_decode 遇到的坑

發(fā)布時(shí)間:2017-08-14 11:14  回復(fù):0  查看:2734   最后回復(fù):2017-08-14 11:14  

本文和大家分享的是phpjson_decode遇到的坑,一起來(lái)看看吧,希望對(duì)大家學(xué)習(xí)php有所幫助。

  場(chǎng)景:某項(xiàng)目客戶反饋,輸出的結(jié)果 JSON 中有個(gè)要求為對(duì)象的數(shù)據(jù)字段,在某些情況下返回的是 [] 而不是 {} ;數(shù)據(jù)由公司其他部門提供,查看原始數(shù)據(jù)的時(shí)候,沒(méi)有發(fā)現(xiàn)任何問(wèn)題;后來(lái)因?yàn)橐尤肽承╊A(yù)處理,在獲取到其他部門的 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)類型語(yǔ)言,如 Java 中的 List Map 的。

  來(lái)看 PHP json_decode() 方法是如何定義的

  mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

  當(dāng)?shù)诙€(gè)參數(shù) $assoc  true 時(shí),返回的類型是 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)類型語(yǔ)言和弱類型語(yǔ)言的 API 對(duì)接上,由于項(xiàng)目的下家是使用 Java 語(yǔ)言,所以導(dǎo)致了 BUG

 

 

來(lái)源:HFXBLOG

您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?