终于用正则表达式一步完美处理了Json数据里的存在单引号/双引号导致解析失败的报错,这样无论什么开发语言,都可以搞定这个问题了。
事故原因是最近我有一段json数据需要处理,但是在处理时发生了报错:
Newtonsoft.Json.JsonReaderException: After parsing a value an unexpected character was encountered: 直. Path '[0].Value', line 1, position 33.
我的json数据原文如下:
[{"Name":"封装/尺寸","Value":"0.330"直径 X 0.925"长(8.38MM X 23.50MM)"},{"Name":"直径","Value":"Φ8.38MM"},{"Name":"阻值","Value":"0.015OHMS"},{"Name":"长度","Value":"23.50MM"},{"Name":"精度","Value":"±1%"},{"Name":"系列","Value":"LVR"},{"Name":"功率","Value":"5W"},{"Name":"工作温度","Value":"-65°C ~ 275°C"}]
可以看到,我标红色的双引号",其实是数据来着,影响了我的json解析,导致解析失败。
那这个双引号其实是数据,该怎么处理呢?
把 双引号(")变成斜杠双引号(\")之后就可以正常解析了。
可以正常解析的json数据应该是这样的:
[{"Name":"封装/尺寸","Value":"0.330\"直径 X 0.925\"长(8.38MM X 23.50MM)"},{"Name":"直径","Value":"Φ8.38MM"},{"Name":"阻值","Value":"0.015OHMS"},{"Name":"长度","Value":"23.50MM"},{"Name":"精度","Value":"±1%"},{"Name":"系列","Value":"LVR"},{"Name":"功率","Value":"5W"},{"Name":"工作温度","Value":"-65°C ~ 275°C"}]
那么怎么找出来这个特殊的双引号呢?
我这边就尝试用正则找出它来。
我先尝试获取格式里后面的引号:
再尝试获取格式里后面的引号:
可以看到两个正则都不会将内容里的双引号拿到。
然后同时取格式里前后的引号:
可以看到很完美地取到了,并且忽略了内容里的双引号。
此处已经拿到了格式里的引号,直接用以下步骤,就可以替换完成了:
先把格式里的替换成特殊符号:
((?<=({|:|,))("))|(")(?=(}|:|,)) ==替换==> ★
然后把数据里的替换成加引号的:
" ==替换==> \"
把格式里的替换成回来:
★==替换==> "
就完成了!
有没有更简单的办法呢?
肯定有的,需要用到排除法:
排除格式里前面的引号:
排除格式里后面的引号:
可以!
把两者结合起来:
拿到数据里的双引号!
好,现在就可以替换,一步到位:
(?<=([^{:,]))(")(?=([^}:,]))==替换==> \"
完美加上:
如果格式里是单引号,同理可以这样找到:
一步替换:
(?<=([^{:,]))(')(?=([^}:,]))==替换==> \'
完美!
这个时候,无论你用什么语言,都可以使用这个正则表达式一步替换,对有这样异常的数据进行修正了。
当然,现实中还有其他的各种特殊情况,复杂多变,肉眼可见的格式错乱,但是程序不一定能100%解决。有其他特殊情况,欢迎在评论区留言沟通。
---------------------------------------
补充:
如果引号附近有空格,可以这样修改:
(?<!(\s*[{:,]\s*))(\")(?!(\s*[}:,]\s*)) ==替换==> \"