json字符串解析碰到的巨坑

最近项目,后台要去读取大量json文件,而这些json文件里面又有各种奇奇怪怪的字符,折磨了我一星期。记录一下坑点:

1.JSON.parse()

(1)将json字符串转为对象,由于对象不能有重复的属性,否则后面的属性值会覆盖前面的,所以json文件中如果有重复的key会被自动去掉。

(2)JSON.parse()对转义字的符执行过程经历了两次转义,例如:

一次是字符串本身的转义

'{"test": "这是一个对象, 里面有 \\"test\\" 字段"}'

被转换成

'{"test": "这是一个对象, 里面有 \"test\" 字段"}'

一次是字符串转对象时的转义

因为已经被转换成了

'{"test": "这是一个对象, 里面有 \"test\" 字段"}'

"\"会被认为是 """的转义符,就会正确的转成对象。

因此'{"test": "这是一个对象, 里面有 \"test\" 字段"}'只有一个"\",到字符串转对象的时候, test 字段值里就有两对双引号,就会报错。

所以如果字符串中存在"\",那么我们需要写成"\\\\"。

2.正则匹配相关  

正则表达式的字面量形式和new RegExp形式,下面两种都用于匹配反斜杠"\"

构造函数形式由于双引号代表字符串,存在第一层字符串转义,然后正则表达式自身存在一层转义,因此同上面JSON.parse()中一样,需要双重转义。

var reg = /\\/g;
var reg = new RegExp("\\\\", "g");

所以字符串中的"\"都是转义字符,需要经过一层字符串转义,如果再叠加其它需要字符转义的方法则需要用双重转义。

写在最后:这次的需求本来是找到json文件中重复的key并且要找到具体重复的位置,所以不能直接用JSON.parse()去除重复。本想着用字符串切割去把一对对的key-value拼接起来,再一个个的key和JSON.parse()去重之后的结果对比,但是我要处理的json文件中的value值中含有很多特殊字符,所以不论怎么去用replace替换再用split切割最后切割的都是混乱的。最后在大佬的指点下,发现了一个神奇的库叫json-dup-key-validator,用它的这个方法就可以找到重复key的位置了。

jsonValidator.validate(jsonString, allowDuplicatedKeys)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值