摘要:原始數(shù)據(jù)其中是我要進(jìn)行處理的字段,處理完成之后再次使用進(jìn)行編碼。所以正確的做法是在解碼的時候不要傳遞第二個參數(shù)讓解碼結(jié)果是一個對象,然后操作對象的屬性,操作完成之后再次編碼就不會出現(xiàn)偏差。
場景:某項目客戶反饋,輸出的結(jié)果 JSON 中有個要求為對象的數(shù)據(jù)字段,在某些情況下返回的是 [] 而不是 {};數(shù)據(jù)由公司其他部門提供,查看原始數(shù)據(jù)的時候,沒有發(fā)現(xiàn)任何問題;后來因為要加入某些預(yù)處理,在獲取到其他部門的 JSON 數(shù)據(jù)之后進(jìn)行解碼并對某個字段進(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": [], ... }
空對象編程了空數(shù)組,而且我并沒有處理過字段 bar
通過對模擬數(shù)據(jù)的實測,發(fā)現(xiàn)是因為在對 JSON 進(jìn)行解碼的時候,是這么解的
$data = json_decode($jsonString, true)
問題就出在這里,由于 PHP 自身的特性,在 PHP 中 array 是可以代表強(qiáng)類型語言,如 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
當(dāng)?shù)诙€參數(shù) $assoc 為 true 時,返回的類型是 array,所以問題就來了,當(dāng) JSON 中空對象 {} 和 [] 空數(shù)組,使用這種方式解碼出來的結(jié)果表現(xiàn)是一致的;即 array();當(dāng)再次 json_encode() 編碼的時候就出現(xiàn)了 {} 變 [] 了。
所以正確的做法是在解碼 JSON 的時候 json_decode 不要傳遞第二個參數(shù);讓解碼結(jié)果是一個對象,然后操作對象的屬性,操作完成之后再次編碼就不會出現(xiàn)偏差。
這種問題最突出在于強(qiáng)類型語言和弱類型語言的 API 對接上,由于項目的下家是使用 Java 語言,所以導(dǎo)致了 BUG
文章也可以在我的博客圍觀 http://www.hfxblog.com/2017/08/03/2017-08-02-Php-json-decode/
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/25581.html
摘要:備注登錄后可在開發(fā)者中心查看對應(yīng)的接口權(quán)限。下載官網(wǎng)提供的示例代碼,參照中的代碼一步一步來實現(xiàn)。否則分享后的頁面會簽名失敗返回的與分享的是否一致 首先完成官方文檔前兩步(很好理解就不具體說了):步驟一:綁定域名先登錄微信公眾平臺進(jìn)入公眾號設(shè)置的功能設(shè)置里填寫JS接口安全域名。備注:登錄后可在開發(fā)者中心查看對應(yīng)的接口權(quán)限。步驟二:引入JS文件在需要調(diào)用JS接口的頁面引入如下JS文件,(支...
摘要:文件夾中的文件首字母大寫。因為在中我沒有找到日期和字符串轉(zhuǎn)換和格式化的靈活方法,所以在中處理格式化的問題。獲取參數(shù)由于框架自身設(shè)計的問題,推薦盡量用方式請求后臺服務(wù),參數(shù)格式為格式。 1.controllers文件夾中的controller文件首字母大寫。不大寫也可以,但是環(huán)境兼容性不好,舉個例子,我開發(fā)環(huán)境在mac電腦上,文件名首字母小寫,服務(wù)可以正常訪問;但是在阿里云服務(wù)器(deb...
摘要:看到一篇很好的文章,關(guān)于處理解析失敗的方法,寫的非常詳細(xì),特此裝載過來。再說,沒有錯誤怎么會失敗呢如果是格式錯誤,再低版本的都會告訴你,所以碰上第一個可能性就往非法字符串想如何處理中的非法字符根據(jù)的編碼范圍,是可以剔除掉非法字符的。 看到一篇很好的文章,關(guān)于處理json_decode解析失敗的方法,寫的非常詳細(xì),特此裝載過來。 一般情況下,獲取到一段json內(nèi)容,直接json_deco...
摘要:在介紹這兩個函數(shù)之前,我還是想說一下。我們需要知道的是可以轉(zhuǎn)為格式的數(shù)據(jù)類型是對象和鍵值對數(shù)組其次是。對格式的字符串進(jìn)行解碼,并轉(zhuǎn)換為變量。這樣我們可以很好的解釋的第二個參數(shù)當(dāng)為時返回數(shù)組當(dāng)為默認(rèn)為時返回對象。 ? ? 在介紹這兩個函數(shù)之前,我還是想說一下json。不知道大家對json了解多少,感覺自己接觸php一段時間后,就已經(jīng)對json有些印象,但僅僅是印象而已,我只知道它是一種數(shù)...
摘要:這是因為文件本身帶了頭,造成函數(shù)無法識別可以用下面的方法去掉這個頭 這是因為文件本身帶了BOM頭,造成json_decode函數(shù)無法識別 可以用下面的方法去掉這個頭 $data = json_decode(trim($fileSource,chr(239).chr(187).chr(191)),true);
閱讀 2970·2023-04-25 17:46
閱讀 3596·2021-11-25 09:43
閱讀 1102·2021-11-18 10:02
閱讀 3060·2021-10-14 09:43
閱讀 2778·2021-10-13 09:40
閱讀 1530·2021-09-28 09:35
閱讀 2191·2019-08-30 15:52
閱讀 3164·2019-08-30 14:06