最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用PHP json_decode可能遇到的坑與解決方法

 更新時間:2017年08月03日 10:52:13   作者:HFX  
在我們?nèi)粘J褂胮hp開發(fā)的時候,經(jīng)常會用到j(luò)son_decode函數(shù),最近在使用json_decode函數(shù)的發(fā)現(xiàn)了一個坑,想著總結(jié)分享出來,所以下面這篇文章主要給大家介紹了關(guān)于使用PHP json_decode可能遇到的坑與解決方法,需要的朋友可以參考借鑒。

前言

最近在做網(wǎng)站 的時候用到了json_decode函數(shù),發(fā)現(xiàn)了一個問題,現(xiàn)在總結(jié)分享出來供大家參考學(xué)習(xí),話不多說了,來一起看看詳細(xì)的介紹吧。

場景:

某項(xiàng)目客戶反饋,輸出的結(jié)果 JSON 中有個要求為對象的數(shù)據(jù)字段,在某些情況下返回的是 [] 而不是 {};數(shù)據(jù)由公司其他部門提供,查看原始數(shù)據(jù)的時候,沒有發(fā)現(xiàn)任何問題;后來因?yàn)橐尤肽承╊A(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ù)的實(shí)測,發(fā)現(xiàn)是因?yà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 對接上,由于項(xiàng)目的下家是使用 Java 語言,所以導(dǎo)致了 BUG

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • PHP實(shí)現(xiàn)數(shù)字補(bǔ)零功能的2個函數(shù)介紹

    PHP實(shí)現(xiàn)數(shù)字補(bǔ)零功能的2個函數(shù)介紹

    這篇文章主要介紹了PHP實(shí)現(xiàn)數(shù)字補(bǔ)零功能的2個函數(shù)介紹,需要的朋友可以參考下
    2014-05-05
  • php中使用array_filter()函數(shù)過濾數(shù)組實(shí)例講解

    php中使用array_filter()函數(shù)過濾數(shù)組實(shí)例講解

    在本篇文章里小編給大家分享的是一篇關(guān)于php中使用array_filter()函數(shù)過濾數(shù)組實(shí)例講解,有興趣的朋友們可以學(xué)習(xí)下。
    2021-03-03
  • 淺談PHP設(shè)計(jì)模式之對象池模式Pool

    淺談PHP設(shè)計(jì)模式之對象池模式Pool

    對象池模式是一種提前準(zhǔn)備了一組已經(jīng)初始化了的對象『池』而不是按需創(chuàng)建或者銷毀的創(chuàng)建型設(shè)計(jì)模式。對象池客戶端會向?qū)ο蟪刂姓埱笠粋€對象,然后使用這個返回的對象執(zhí)行相關(guān)操作。當(dāng)客戶端使用完畢,它將把這個特定類型的工廠對象返回給對象池,而不是銷毀掉這個對象。
    2021-05-05
  • PHP中$_SERVER的詳細(xì)參數(shù)與說明介紹

    PHP中$_SERVER的詳細(xì)參數(shù)與說明介紹

    PHP編程中經(jīng)常需要用到一些服務(wù)器的一些資料,特把$_SERVER的詳細(xì)參數(shù)整理下,方便以后使用
    2013-10-10
  • PHP實(shí)現(xiàn)的數(shù)據(jù)對象映射模式詳解

    PHP實(shí)現(xiàn)的數(shù)據(jù)對象映射模式詳解

    這篇文章主要介紹了PHP實(shí)現(xiàn)的數(shù)據(jù)對象映射模式,結(jié)合實(shí)例形式分析了php數(shù)據(jù)對象映射模式的原理、實(shí)現(xiàn)步驟及相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • php利用反射實(shí)現(xiàn)插件機(jī)制的方法

    php利用反射實(shí)現(xiàn)插件機(jī)制的方法

    這篇文章主要介紹了php利用反射實(shí)現(xiàn)插件機(jī)制的方法,涉及php反射機(jī)制與插件的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2015-03-03
  • php跨域檢測類允許部分域名訪問的示例詳解

    php跨域檢測類允許部分域名訪問的示例詳解

    PHP跨域檢測類是一種封裝了跨域檢測邏輯的PHP類,它可以用于在PHP應(yīng)用程序中檢測和處理跨域請求,以確保安全和正常的跨域通信,本文給出了示例給大家介紹php如何允許部分域名訪問,需要的朋友可以參考下
    2023-12-12
  • php圖形jpgraph操作實(shí)例分析

    php圖形jpgraph操作實(shí)例分析

    這篇文章主要介紹了php圖形jpgraph操作,結(jié)合具體實(shí)例形式分析了php基于jpgraph圖形庫實(shí)現(xiàn)圖形繪制的相關(guān)操作技巧,需要的朋友可以參考下
    2017-02-02
  • php5新改動之短標(biāo)記啟用方法

    php5新改動之短標(biāo)記啟用方法

    PHP5中為了規(guī)范性的考慮.短標(biāo)記<?......?>這種方式默認(rèn)是被關(guān)閉的.只支持<?php....?>的標(biāo)準(zhǔn)標(biāo)記.
    2008-09-09
  • 如何讓PHP編碼更加好看利于閱讀

    如何讓PHP編碼更加好看利于閱讀

    在本篇文章里小編給大家分享了關(guān)于如何讓PHP編碼更加好看利于閱讀的方法和習(xí)慣,需要的朋友們可以學(xué)習(xí)下。
    2019-05-05

最新評論

偏关县| 衡南县| 华宁县| 彭州市| 互助| 巴南区| 兰州市| 廊坊市| 孟州市| 湘潭县| 漳平市| 宁阳县| 漳州市| 东乡| 红原县| 元阳县| 宁都县| 霍山县| 山丹县| 柳州市| 安新县| 云浮市| 石林| 田林县| 大足县| 白银市| 睢宁县| 玉林市| 东海县| 新巴尔虎左旗| 连州市| 普格县| 申扎县| 大关县| 岗巴县| 安顺市| 望都县| 隆安县| 肇源县| 宁城县| 兴业县|