我需要反序列化以下字符串:
{
"bw": 20,
"center_freq": 2437,
"channel": 6,
"essid": "DIRECT-sB47" Philips 6198",
"freq": 2437
}
这几乎是正确的JSON,除了值DIRECT-sB47" Philips 6198
中的引号引起字符串的过早终止而破坏了其余的JSON。
是否可以反序列化具有模式的元素
"key": "something which includes a quote",
还是我应该先使用正则表达式对字符串进行预处理以删除该引号(我不在乎,也不关心键或值中的任何其他奇怪字符)?
更新:很抱歉未能发布代码(这是通过json
进行的标准反序列化)。代码是also available at repl.it
import json
data = '''
{
"bw": 20,
"center_freq": 2437,
"channel": 6,
"essid": "DIRECT-sB47" Philips 6198",
"freq": 2437
}
'''
trans = json.loads(data)
print(trans)
回溯:
Traceback (most recent call last):
File "main.py", line 12, in <module>
trans = json.loads(data)
File "/usr/local/lib/python3.6/json/__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "/usr/local/lib/python3.6/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/lib/python3.6/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 6 column 26 (char 79)
没有引号的相同代码可以正常工作
import json
data = '''
{
"bw": 20,
"center_freq": 2437,
"channel": 6,
"essid": "DIRECT-sB47 Philips 6198",
"freq": 2437
}
'''
trans = json.loads(data)
print(trans)
评论:我意识到JSON的提供者应该修复他们的代码(我与他们一起打开了错误报告)。同时,在错误修复之前(如果是),我想尝试一种解决方法。
答案 0 :(得分:0)
我最终分析了异常,其中包括错误字符的位置,将其删除并再次反序列化(循环)。
最坏的情况是吞没了整个数据字符串,就我而言,这比崩溃还好。
import json
import re
data = '''
{
"bw": 20,
"center_freq": 2437,
"channel": 6,
"essid": "DIRECT-sB47" Philips 6198",
"freq": 2437
}
'''
while True:
try:
trans = json.loads(data)
except json.decoder.JSONDecodeError as e:
s = int(re.search(r"\.*char (\d+)", str(e)).group(1))-2
print(f"incorrect character at position {s}, removing")
data = data[:s] + data[(s + 1):]
else:
break
print(trans)