json_decode在php中的一些无法解析的字符串

 关于json_decode在php中的一些无法解析的字符串,包括以下几种常见类型。

一、Bug #42186 json_decode() won't work with \l

当字符串中含有\l的时候,json_decode是无法解析,测试代码:

echo "***********json_decode() won't work with \l*************<br/>";
$json = '{"stringwithbreak":"line with a \lbreak!"}';
var_dump($json);//stringwithbreak":"line with a \lbreak!
var_dump(json_decode($json, true));//null

解决办法:

主要是将\l进行替换,当然如果真的需要‘\l’,我们就必须不使用json_decode进行解析,可以当作当个字符进行提交。

var_dump(str_replace("\\l", "", $json));//stringwithbreak":"line with a break!
print_r(json_decode(str_replace("\\l", "", $json), true));//Array ( [stringwithbreak] => line with a break! ) 

二、Tabs in Javascript strings break json_decode()

当字符串中含有tab键时,json_decode()无法解析,例如代码3-1

echo "<br/>***********Tabs in Javascript strings break json_decode()*************<br/>";
var_dump(json_decode('{ "abc": 12, "foo": "bar	bar" }'));

执行后的返回结果为null

解决办法:

1、当遇到含有tab键输入的字符串时,我们应该避免使用json将数据传到php,然后使用php作为解析。

2、同样可以使用如下3-2代码方式进行替换

$myStr = '{ "abc": 12, "foo": "bar	bar" }';
$replaceStr = str_replace("	", "\\t", $myStr);
var_dump($replaceStr);
var_dump(json_decode($replaceStr ));

三、json_decode returns false when leading zeros aren't escaped with double quotes

当json的value值为number类型,而且该number以0开头,例如代码4-1

echo "<br/>***********json_decode returns false when leading zeros aren't escaped with double quotes*************<br/>";
$noZeroNumber = '{
  "test" : 6
}';
$zeroNumber= '{
  "test" : 06
}';
var_dump(json_decode($noZeroNumber));//object(stdClass)[1]
  public 'test' => int 6
var_dump(json_decode($zeroNumber));//null

或许对于这种问题很少出现,但是一旦出现了,我们就很难去查找问题的原因。

四、decode chokes on unquoted object keys

当key值没有使用引号时,会无法解析,例如代码5-1

echo "<br/>***********decode chokes on unquoted object keys*************<br/>";
var_dump(json_decode('{"a":"tan","model":"sedan"}'));//object(stdClass)[1]
  public 'a' => string 'tan' (length=3)
  public 'model' => string 'sedan' (length=5)
var_dump(json_decode('{a:"tan","model":"sedan"}'));//null

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaQ

高并发编程-volatile详解

在介绍volatile之前,先简单了解一下Java内存模型。在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏...

793
来自专栏PPV课数据科学社区

python多线程编程(2): 线程的创建、启动、挂起和退出

如上一节,python 的threading.Thread类有一个run方法,用于定义线程的功能函数,可以在自己的线程类中覆盖该方法。而创建自己的线程实例后,通...

2316
来自专栏Java帮帮-微信公众号-技术文章全总结

03.线程安全/同步/线程通讯

03.线程安全/同步/线程通讯 一.一个典型的Java线程安全例子 ? ? 上面例子很容易理解,有一张银行卡,里面有1000的余额,程序模拟你和你老婆同时在取款...

4317
来自专栏python3

习题31:访问列表元素

访问列表中的元素,使用下标的方式,通常以0开始(为什么是0而不是1),这里程序的设计就是如此,个人觉得没有必要纠结,如有兴趣,可自行查看资料

802
来自专栏菩提树下的杨过

利用ganymed-ssh2远程执行其它Linux机器上的shell命令

实际应用中,有时候需要从web管理界面上,远程去启动其它linux主机上的程序,利用ssh协议可以方便的满足这一需求。事实上hadoop架构中,从nn上启动dn...

24510
来自专栏Java架构沉思录

聊聊Java动态代理(上)

前言 在之前的文章《聊聊设计模式之代理模式》中,笔者为大家介绍了代理模式,在这里简单回顾一下。代理模式的作用是提供一个代理来控制对一个对象的访问,因此我们可以...

36213
来自专栏nummy

__import__详解

当使用import导入Python模块的时候,默认调用的是__import__()函数。直接使用该函数的情况很少见,一般用于动态加载模块。

852
来自专栏JAVA技术zhai

干货:Java多线程详解(内附源码)

2644
来自专栏Java帮帮-微信公众号-技术文章全总结

03.线程安全/同步/线程通讯

03.线程安全/同步/线程通讯 一.一个典型的Java线程安全例子 ? ? 上面例子很容易理解,有一张银行卡,里面有1000的余额,程序模拟你和你老婆同时在取款...

3447
来自专栏Python攻城狮

Pyramid中的request和response1.Request2.Multidict3.Response

官方API:pyramid.request、pyramid.response 和 pyramid.httpexceptions。

791

扫码关注云+社区