使用PHP json_decode可能遇到的坑与解决方法

 更新时间:2017年08月03日 10:52:13   作者:HFX  
在我们日常使用php开发的时候,经常会用到json_decode函数,最近在使用json_decode函数的发现了一个坑,想着总结分享出来,所以下面这篇文章主要给大家介绍了关于使用PHP json_decode可能遇到的坑与解决方法,需要的朋友可以参考借鉴。

前言

最近在做网站 的时候用到了json_decode函数,发现了一个问题,现在总结分享出来供大家参考学习,话不多说了,来一起看看详细的介绍吧。

场景:

某项目客户反馈,输出的结果 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

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

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

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

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • PHP实现数字补零功能的2个函数介绍

    PHP实现数字补零功能的2个函数介绍

    这篇文章主要介绍了PHP实现数字补零功能的2个函数介绍,需要的朋友可以参考下
    2014-05-05
  • php中使用array_filter()函数过滤数组实例讲解

    php中使用array_filter()函数过滤数组实例讲解

    在本篇文章里小编给大家分享的是一篇关于php中使用array_filter()函数过滤数组实例讲解,有兴趣的朋友们可以学习下。
    2021-03-03
  • 浅谈PHP设计模式之对象池模式Pool

    浅谈PHP设计模式之对象池模式Pool

    对象池模式是一种提前准备了一组已经初始化了的对象『池』而不是按需创建或者销毁的创建型设计模式。对象池客户端会向对象池中请求一个对象,然后使用这个返回的对象执行相关操作。当客户端使用完毕,它将把这个特定类型的工厂对象返回给对象池,而不是销毁掉这个对象。
    2021-05-05
  • PHP中$_SERVER的详细参数与说明介绍

    PHP中$_SERVER的详细参数与说明介绍

    PHP编程中经常需要用到一些服务器的一些资料,特把$_SERVER的详细参数整理下,方便以后使用
    2013-10-10
  • PHP实现的数据对象映射模式详解

    PHP实现的数据对象映射模式详解

    这篇文章主要介绍了PHP实现的数据对象映射模式,结合实例形式分析了php数据对象映射模式的原理、实现步骤及相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • php利用反射实现插件机制的方法

    php利用反射实现插件机制的方法

    这篇文章主要介绍了php利用反射实现插件机制的方法,涉及php反射机制与插件的实现技巧,需要的朋友可以参考下
    2015-03-03
  • php跨域检测类允许部分域名访问的示例详解

    php跨域检测类允许部分域名访问的示例详解

    PHP跨域检测类是一种封装了跨域检测逻辑的PHP类,它可以用于在PHP应用程序中检测和处理跨域请求,以确保安全和正常的跨域通信,本文给出了示例给大家介绍php如何允许部分域名访问,需要的朋友可以参考下
    2023-12-12
  • php图形jpgraph操作实例分析

    php图形jpgraph操作实例分析

    这篇文章主要介绍了php图形jpgraph操作,结合具体实例形式分析了php基于jpgraph图形库实现图形绘制的相关操作技巧,需要的朋友可以参考下
    2017-02-02
  • php5新改动之短标记启用方法

    php5新改动之短标记启用方法

    PHP5中为了规范性的考虑.短标记<?......?>这种方式默认是被关闭的.只支持<?php....?>的标准标记.
    2008-09-09
  • 如何让PHP编码更加好看利于阅读

    如何让PHP编码更加好看利于阅读

    在本篇文章里小编给大家分享了关于如何让PHP编码更加好看利于阅读的方法和习惯,需要的朋友们可以学习下。
    2019-05-05

最新评论