如何自动修复无效的JSON字符串?

从2gis API中,我获得了以下JSON字符串

{

"api_version": "1.3",

"response_code": "200",

"id": "3237490513229753",

"lon": "38.969916127827",

"lat": "45.069889625267",

"page_url": null,

"name": "ATB",

"firm_group": {

"id": "3237499103085728",

"count": "1"

},

"city_name": "Krasnodar",

"city_id": "3237585002430511",

"address": "Turgeneva, 172/1",

"create_time": "2008-07-22 10:02:04 07",

"modification_time": "2013-08-09 20:04:36 07",

"see_also": [

{

"id": "3237491513434577",

"lon": 38.973110606808,

"lat": 45.029031222211,

"name": "Advance",

"hash": "5698hn745A8IJ1H86177uvgn94521J3464he26763737242Cf6e654G62J0I7878e",

"ads": {

"sponsored_article": {

"title": "Center "ADVANCE"",

"text": "Business.English."

},

"warning": null

}

}

]

}

但是Python无法识别它:

json.loads(firm_str)

期望的分隔符:第1行第3646列(字符3645)

似乎用引号引起问题:“标题”:“中心“ ADVANCE””

如何在Python中自动修复它?

回答:

@Michael的回答给了我一个主意……这不是一个很漂亮的主意,但是它似乎可以工作,至少在您的示例中有效:尝试解析JSON字符串,如果失败,则查找失败的字符。异常字符串1并替换该字符。

while True:

try:

result = json.loads(s) # try to parse...

break # parsing worked -> exit loop

except Exception as e:

# "Expecting , delimiter: line 34 column 54 (char 1158)"

# position of unexpected character after '"'

unexp = int(re.findall(r'\(char (\d+)\)', str(e))[0])

# position of unescaped '"' before that

unesc = s.rfind(r'"', 0, unexp)

s = s[:unesc] + r'\"' + s[unesc+1:]

# position of correspondig closing '"' (+2 for inserted '\')

closg = s.find(r'"', unesc + 2)

s = s[:closg] + r'\"' + s[closg+1:]

print result

您可能需要添加一些其他检查,以防止此操作以无限循环结束(例如,与字符串中的字符一样,最大重复次数)。

另外,"如@gnibbler所指出的那样,如果错误的后面实际上是逗号,这仍然将不起作用。

这似乎是工作 相当

现在好了(虽然还不够完善),即使转义"后跟一个逗号,或者在这种情况下,闭架的,因为它可能会获得有关(预期属性名后,语法错误投诉等)并追溯到最后一个"。它还自动转义相应的结束符"(假设存在一个)。


1)例外str"Expecting , delimiter: line XXX column YYY (char

ZZZ)",其中ZZZ是字符串中发生错误的位置。但是请注意,该消息可能取决于Python的版本,json模块,操作系统或语言环境,因此可能必须相应地调整此解决方案。

以上是 如何自动修复无效的JSON字符串? 的全部内容, 来源链接: utcz.com/qa/425866.html

回到顶部