如何反序列化在字符串值中带有引号的字符串?

时间:2018-12-04 22:36:49

标签: python json python-3.x

我需要反序列化以下字符串:

{
  "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的提供者应该修复他们的代码(我与他们一起打开了错误报告)。同时,在错误修复之前(如果是),我想尝试一种解决方法。

1 个答案:

答案 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)