关于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

要删除JSON文件没有加双引号的字母,您需要进行以下步骤: 1. 读取JSON文件并将其解析为Python对象。 2. 遍历Python对象,找到所有字符串类型的值。 3. 对于每个字符串类型的值,检查其是否包含没有加双引号的字母。 4. 如果字符串包含没有加双引号的字母,则删除该字符串。 5. 将Python对象重新转换为JSON格式,并将其写回原始文件。 下面是一个Python示例代码,可以实现上述步骤: ```python import json def is_valid_json_string(s): try: json.loads(s) return True except ValueError: return False def fix_json_file(filename): with open(filename, 'r') as f: data = json.load(f) for key, value in data.items(): if isinstance(value, str) and not is_valid_json_string(value): del data[key] with open(filename, 'w') as f: json.dump(data, f, indent=4) ``` 在上面的代码,`is_valid_json_string`函数用于检查字符串是否为有效的JSON格式,如果字符串不是有效的JSON格式,则返回False。在`fix_json_file`函数,首先读取JSON文件并将其解析为Python对象。然后遍历Python对象的所有键值对,如果值是字符串类型并且包含没有加双引号的字母,则删除该键值对。最后将Python对象重新转换为JSON格式,并将其写回原始文件。 请注意,该代码仅删除了JSON文件包含没有加双引号的字母的字符串,但是如果JSON文件还存在其他格式问题,则该代码可能无法处理。因此,在使用此代码之前,请确保您的JSON文件符合基本的JSON格式规范。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值