Php學習之json_decode 遇到的坑詳解

來源:互聯網
上載者:User

標籤:

本文和大家分享的是php中json_decode遇到的坑,一起來看看吧,希望對大家學習php有所協助。

情境:某項目客戶回函,輸出的結果 JSON 中有個要求為對象的資料欄位,在某些情況下返回的是 [] 而不是 {} ;資料由公司其他部門提供,查看未經處理資料的時候,沒有發現任何問題;後來因為要加入某些預先處理,在擷取到其他部門的 JSON 資料之後進行解碼並對某個欄位進行處理;然而,在處理完之後再次使用JSON 輸出,發現結果已經不是我們想要的了。

未經處理資料

{

...,

"foo": "",

"bar": {},

...

}

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

編碼完成之後的結果卻是這樣的

{

...,

"foo": "",

"bar": [],

...

}

Null 物件編程了空數組,而且我並沒有處理過欄位 bar

通過對類比資料的實測,發現是因為在對 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 ]]] )

當第二個參數 $assoc 為 true 時,返回的類型是 array ,所以問題就來了,當 JSON 中Null 物件 {} 和[] 空數組,使用這種方式解碼出來的結果表現是一致的;即 array() ;當再次 json_encode() 編碼的時候就出現了 {} 變 [] 了。

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

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

 

 

來源:HFX的BLOG

Php學習之json_decode 遇到的坑詳解

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.