json_decode无法解析\t的问题


1)源代码
<?php 


 $ret="[\"real_server 123.125.160.121 80 {\",\"	real_server 123.125.160.122 80 {\"]";
 
 $jd = json_decode($ret);
 var_dump($jd);
 ?>


结果
null


2)源代码
<?php 


 $ret="[\"real_server 123.125.160.121 80 {\",\"	real_server 123.125.160.122 80 {\"]";
 
 $ret=preg_replace("/\t/", " ", $ret);
 $jd = json_decode($ret);
 var_dump($jd);
 ?>


 结果
 array
  0 => string 'real_server 123.125.160.121 80 {' (length=32)
  1 => string ' real_server 123.125.160.122 80 {' (length=33)
 
 问题原因:json_decode 函数无法解析tab键
###################################################
 以下为网上找到的一篇文章


 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值