资讯专栏INFORMATION COLUMN

PHP json_decode 遇到的坑

Ryan_Li / 2022人阅读

摘要:原始数据其中是我要进行处理的字段,处理完成之后再次使用进行编码。所以正确的做法是在解码的时候不要传递第二个参数让解码结果是一个对象,然后操作对象的属性,操作完成之后再次编码就不会出现偏差。

场景:某项目客户反馈,输出的结果 JSON 中有个要求为对象的数据字段,在某些情况下返回的是 [] 而不是 {};数据由公司其他部门提供,查看原始数据的时候,没有发现任何问题;后来因为要加入某些预处理,在获取到其他部门的 JSON 数据之后进行解码并对某个字段进行处理;然而,在处理完之后再次使用 JSON 输出,发现结果已经不是我们想要的了。

原始数据

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

其中 foo 是我要进行处理的字段,处理完成之后再次使用 json_encode($data) 进行 JSON 编码。

编码完成之后的结果却是这样的

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

空对象编程了空数组,而且我并没有处理过字段 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 ]]] )

来源 http://php.net/manual/zh/function.json-decode.php

当第二个参数 $assoctrue 时,返回的类型是 array,所以问题就来了,当 JSON 中空对象 {}[] 空数组,使用这种方式解码出来的结果表现是一致的;即 array();当再次 json_encode() 编码的时候就出现了 {}[] 了。

所以正确的做法是在解码 JSON 的时候 json_decode 不要传递第二个参数;让解码结果是一个对象,然后操作对象的属性,操作完成之后再次编码就不会出现偏差。

这种问题最突出在于强类型语言和弱类型语言的 API 对接上,由于项目的下家是使用 Java 语言,所以导致了 BUG

文章也可以在我的博客围观 http://www.hfxblog.com/2017/08/03/2017-08-02-Php-json-decode/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25581.html

相关文章

  • thinkphp3.2,微信JS-SDK开发过程中遇到的各种问题与细节分享

    摘要:备注登录后可在开发者中心查看对应的接口权限。下载官网提供的示例代码,参照中的代码一步一步来实现。否则分享后的页面会签名失败返回的与分享的是否一致 首先完成官方文档前两步(很好理解就不具体说了):步骤一:绑定域名先登录微信公众平台进入公众号设置的功能设置里填写JS接口安全域名。备注:登录后可在开发者中心查看对应的接口权限。步骤二:引入JS文件在需要调用JS接口的页面引入如下JS文件,(支...

    miya 评论0 收藏0
  • CodeIgniter遇到的坑

    摘要:文件夹中的文件首字母大写。因为在中我没有找到日期和字符串转换和格式化的灵活方法,所以在中处理格式化的问题。获取参数由于框架自身设计的问题,推荐尽量用方式请求后台服务,参数格式为格式。 1.controllers文件夹中的controller文件首字母大写。不大写也可以,但是环境兼容性不好,举个例子,我开发环境在mac电脑上,文件名首字母小写,服务可以正常访问;但是在阿里云服务器(deb...

    andot 评论0 收藏0
  • (转)php json_decode解析失败及错误处理

    摘要:看到一篇很好的文章,关于处理解析失败的方法,写的非常详细,特此装载过来。再说,没有错误怎么会失败呢如果是格式错误,再低版本的都会告诉你,所以碰上第一个可能性就往非法字符串想如何处理中的非法字符根据的编码范围,是可以剔除掉非法字符的。 看到一篇很好的文章,关于处理json_decode解析失败的方法,写的非常详细,特此装载过来。 一般情况下,获取到一段json内容,直接json_deco...

    KaltZK 评论0 收藏0
  • 详解php中的json_encode()和json_decode()函数

    摘要:在介绍这两个函数之前,我还是想说一下。我们需要知道的是可以转为格式的数据类型是对象和键值对数组其次是。对格式的字符串进行解码,并转换为变量。这样我们可以很好的解释的第二个参数当为时返回数组当为默认为时返回对象。     在介绍这两个函数之前,我还是想说一下json。不知道大家对json了解多少,感觉自己接触php一段时间后,就已经对json有些印象,但仅仅是印象而已,我只知道它是一种数...

    Pines_Cheng 评论0 收藏0
  • PHP file_get_contents打开文件 无法json_decode问题

    摘要:这是因为文件本身带了头,造成函数无法识别可以用下面的方法去掉这个头 这是因为文件本身带了BOM头,造成json_decode函数无法识别 可以用下面的方法去掉这个头 $data = json_decode(trim($fileSource,chr(239).chr(187).chr(191)),true);

    ddongjian0000 评论0 收藏0

发表评论

0条评论

Ryan_Li

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<