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