最近项目,后台要去读取大量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)