关于php中解析json时值中包含双引号的问题

首先写在前面,以下内容都是在讨论json中的 \" 结构。 \" 反斜线+双引号 在json是一个正常的结构体!


我有一个比较大的json格式数据,是通过接口拿到的,在拿到之后,我的代码中对这段json进行了去掉反斜线的解析:


$json = callApi($url);
$json = stripcslashes($json);
$result = json_decode($json);



此时如果数据源json中包含有\"这样的字符时,此时经过stripcslashes"加工“之后是无法再得到正确的json格式的,也就是变成了脏数据。


所以我企图用正则表达式匹配到所有这其中被去掉了反斜线孤零零的双引号:


$json_like = '{"key0":要"123123123,"key1":23.4,"key2":wokao"kao,"key3":18"分3}';
$result = preg_match_all('/([^{}:,\]]"[^{}:,\]])/', $json_like, $matchs);
echo '<pre>';print_r($matchs);exit;


这里是观察到了json中的这样的规律:双引号左右必定包含这么几个字符:'{' , '}', '[', ']', ':', ',' 这样就能寻找到json数据中非法的双引号,但是却无法替换,总之到这里我就无法替换了,所以对于已经被stripcslashes过的json数据,已经彻底脏了无法还原。


其实下面的json格式是正确的:


$json_like = '{"key0":"要\"123123123","key1":23.4,"key2":"wo\"kao","key3":"18\"分3"}';


json的key:value的value中如果含有双引号的时候,json会自动为双引号添加反斜线,现在你对这个字符串进行json_decode,解析之后的数组是这样的:


Array
(
    [key0] => 要"123123123
    [key1] => 23.4
    [key2] => wo"kao
    [key3] => 18"分3
)

可以看到反斜线已经被去掉。


之后我们再对这个数组进行json_encode,得到结果:


{"key0":"\u8981\"123123123","key1":23.4,"key2":"wo\"kao","key3":"18\"\u52063"}

会自动又为双引号加上反斜线。





综上,预防我的这种情况产生的最好方式就是不要对json数据进行stripcslashes操作,以免将数组中正常的 \" 结构给破坏掉了。


另外,这里有一个很好的json格式校验网站:http://www.bejson.com

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值