我正在使用Python(2.7)’json’模块来处理各种JSON feed。不幸的是,这些提要中的某些不符合JSON标准- 特别是某些键没有用双语音标记(“)包装。这导致Python出现错误。
我想写一个丑陋的代码来解析和修复传入的数据之前,我想问一下-有什么方法可以让Python解析此格式错误的JSON或“修复”数据,以便有效的JSON?
工作实例
import json >>> json.loads('{"key1":1,"key2":2,"key3":3}') {'key3': 3, 'key2': 2, 'key1': 1}
破例
import json >>> json.loads('{key1:1,key2:2,key3:3}') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python27\lib\json\__init__.py", line 310, in loads return _default_decoder.decode(s) File "C:\Python27\lib\json\decoder.py", line 346, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "C:\Python27\lib\json\decoder.py", line 362, in raw_decode obj, end = self.scan_once(s, idx) ValueError: Expecting property name: line 1 column 1 (char 1)
我编写了一个小的REGEX来修复来自此特定提供程序的JSON,但我认为这将是将来的问题。以下是我的想法。
>>> import re >>> s = '{key1:1,key2:2,key3:3}' >>> s = re.sub('([{,])([^{:\s"]*):', lambda m: '%s"%s":'%(m.group(1),m.group(2)),s) >>> s '{"key1":1,"key2":2,"key3":3}'
您正在尝试使用JSON解析器来解析不是JSON的内容。最好的选择是让提要的创建者对其进行修复。
我知道这并不总是可能的。您可能可以使用正则表达式来修复数据,具体取决于数据的破坏程度:
j = re.sub(r"{\s*(\w)", r'{"\1', j) j = re.sub(r",\s*(\w)", r',"\1', j) j = re.sub(r"(\w):", r'\1":', j)