为什么在PHP中使用json_decode()函数解析JSON字符串会返回NULL?

说白了,大多数时候PHP的json_decode()返回NULL的时候,是JSON字符串本身有问题,特别是双引号没有转义或者嵌套结构搞乱了。

我们先来说说最重要的事情。
嵌套 JSON 未转义双引号是一个常见的陷阱。
例如,去年运行该项目时,有一个 avinfo 字段,直接将 JSON 字符串插入其中,如 "avinfo":"{attachedpic:null...}",而没有转义里面的双引号。
\",解析器立刻就混乱了。
另外,字符串中混入了单引号或者BOM头等不可见字符,比如从系统文件传输过来的数据,往往会导致解析错误。
还有一个细节也相当关键。
去年我们测了大约3 000个JSON,只要整个JSON中少了一个逗号,我就以为服务器可能有问题

一开始,后来发现是错误的数据,并且有规律性和错误性控制说实话是挺难的,但是很多人都没有注意这一点。

PHP如何从JSON字符串中提取指定的值?

说实话,我在使用PHP处理JSON的时候遇到过很多坑。
就拿你提到的例子来说。
最容易出错的地方其实就隐藏在这些细节之中。

比如json_decode()的第二个参数,我第一次使用的时候总是很困惑。
有一次,在处理 API 返回的数据时,我尝试将其解码为对象并使用数组语法直接访问它,但结果是崩溃了。
后来我才明白 true 返回一个关联数组,所以我可以使用 [key]。
如果省略或设置为 false,则成为对象,并且必须使用 ->。
就像玩游戏一样。
如果选择了错误的模式,自然就无法正常工作。

访问嵌套数据需要更多耐心。
之前做过一个项目,JSON结构太深了,不得不一层层剥开。
有一次,直接访问 $data['item']['content']['news_item']['url'] 时,整个程序崩溃了,因为缺少 [0] 索引。
经过长时间调试,发现JSON中的项都是空数组。
这让我想起了当时调试微信API接口的时候。
返回的项目是一个空数组。
结果我直接用[0]访问,程序直接给我报了未定义索引的错误。
后来我加了一个isset()判断来完成这个。

就错误处理而言,json_last_error()确实是救世主。
有一次我在测试一个第三方API,他们返回的JSON格式有问题。
使用json_decode()直接返回null。
即使在那时,我也想知道这些数据去了哪里。
我检查了一下,发现少了一个逗号。
这就是 json_last_error_msg() 派上用场的地方,它直接告诉您错误发生的位置以及节省了多少时间。

我们在处理丢失的钥匙时也遇到了陷阱。
有一次,当我编写函数时,用户没有填写某些字段,当我直接使用 $data['field'] 访问它们时,出现错误。
后来改成了$$data['field'] 这是一个可靠的“默认”。
这个方法对我来说特别有效,我以后经常使用它。

我曾经写过一个数据同步脚本来处理数千条JSON数据。
结果,json_decode() 由于 JSON 格式问题而破坏了我的脚本。
后来我们使用流分析解决了这个问题。
因此,在处理大文件时,不可能一上传就全部解码。
必须考虑内存问题。

事实上,我的这些技能是通过不断陷入陷阱而发展起来的。
想一想。
复杂的 JSON 结构可以包含数十个嵌套层。
此时,如果你没有耐心逐层搜索并手动接近,出错的几率有多大?因此,使用 PHP 处理 JSON 时,耐心比技巧更重要。

浅析PHP中json_encode、json_decode与serialize、unserialize的性能测试

需要明确的是:JSON 解析比序列化慢得多。

上周我在做一个项目,发现反序列化 json_decode 几乎是反序列化的两倍。
PHP5 .2 和 5 .3 中的序列化速度更快。

JSON 在 5 .3 中稍慢一些,但差异很小。
序列化通常更有效。

JSON 输出尺寸较小,但不影响性能。

版本越高速度越快,但功能效率关系不变。

JSON用于所有语言,序列化用于PHP。

您如何看待跨语言场景下数据大小和性能之间的权衡?