首先写在前面,以下内容都是在讨论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