PHP json_decode 遇到的坑

場景:某項目客戶反饋,輸出的結果 JSON 中有個要求爲對象的數據字段,在某些狀況下返回的是 [] 而不是 {};數據由公司其餘部門提供,查看原始數據的時候,沒有發現任何問題;後來由於要加入某些預處理,在獲取到其餘部門的 JSON 數據以後進行解碼並對某個字段進行處理;然而,在處理完以後再次使用 JSON 輸出,發現結果已經不是咱們想要的了。php

原始數據編程

{
  ...,
  "foo": "",
  "bar": {},
  ...
}

其中 foo 是我要進行處理的字段,處理完成以後再次使用 json_encode($data) 進行 JSON 編碼。json

編碼完成以後的結果倒是這樣的數組

{
  ...,
  "foo": "",
  "bar": [],
  ...
}

空對象編程了空數組,並且我並無處理過字段 bar編碼

經過對模擬數據的實測,發現是由於在對 JSON 進行解碼的時候,是這麼解的.net

$data = json_decode($jsonString, true)

問題就出在這裏,因爲 PHP 自身的特性,在 PHP 中 array 是能夠表明強類型語言,如 Java 中的 List 和 Map 的。code

來看 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.phpblog

當第二個參數 $assoctrue 時,返回的類型是 array,因此問題就來了,當 JSON 中空對象 {}[] 空數組,使用這種方式解碼出來的結果表現是一致的;即 array();當再次 json_encode() 編碼的時候就出現了 {}[] 了。get

因此正確的作法是在解碼 JSON 的時候 json_decode 不要傳遞第二個參數;讓解碼結果是一個對象,而後操做對象的屬性,操做完成以後再次編碼就不會出現誤差。

這種問題最突出在於強類型語言和弱類型語言的 API 對接上,因爲項目的下家是使用 Java 語言,因此致使了 BUG

文章也能夠在個人博客圍觀 http://www.hfxblog.com/2017/08/03/2017-08-02-Php-json-decode/

相關文章
相關標籤/搜索