当前位置: 首页 > 知识库问答 >
问题:

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

蒙华翰
2023-03-14

从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)

我如何在Python中自动修复它?

共有1个答案

农存
2023-03-14

@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“expected,delimiter:line XXX column YYY(char ZZZ)”,其中ZZZ是发生错误的字符串中的位置。但是请注意,该消息可能取决于Python的版本、JSON模块、OS或区域设置,因此可能必须相应地调整该解决方案

 类似资料:
  • 问题内容: 从2gis API中,我获得了以下JSON字符串。 但是Python无法识别它: 期望的分隔符:第1行第3646列(字符3645) 似乎用引号引起问题:“标题”:“中心“ ADVANCE”” 如何在Python中自动修复它? 问题答案: @Michael的回答给了我一个主意……这不是一个很漂亮的主意,但是它似乎可以工作,至少在您的示例中有效:尝试解析JSON字符串,如果失败,则查找失败

  • 问题内容: 远程服务器(不在我的控制范围内)发送一个JSON字符串,该字符串具有所有转义的字段名和值。例如,当我执行JSON.stringify(res)时,结果如下: 现在,当我执行alert(res.orderId)时,它说未定义。我认为是因为逃脱了。我该如何解决? 问题答案: 假设这 是显示 的实际值,请考虑: 请注意将JSON.stringify应用于值(这是一个 字符串 ,因为JSON

  • 在Jenkins中解析json文件时面临以下错误 Json文件 错误 hudson.remoting.代理异常:net.sf.json.JSONExcture:无效的JSON字符串在net.sf.json.JSONSerializer.toJSON(JSONSerializer.java:143)在net.sf.json.JSONSerializer.toJSON(JSONSerializer.j

  • 问题内容: Java字符串修剪不会为我删除空格字符。 输出为。请注意1右边的空间。 我必须从字符串中删除尾随空格,但既不要也不删除它。 无论哪种方式,字符串都保持相同。 编辑:完整代码 :: 为什么我不能删除那个空间? 问题答案: 该网站的源代码显示特殊的html字符。尝试在您的java字符串中搜索或替换以下内容:。 那是一个不可破坏的空间。请参阅:我有一个带有“ \ u00a0”的字符串,我需要

  • 问题内容: 我想知道是否有一种方法可以解码类似JSON的字符串。 我得到了字符串: 这不是有效的JSON字符串,因此我无法直接使用python API对其进行解码。Python将仅接受字符串化的JSON字符串,例如: 其中属性被引用为字符串。 问题答案: 使用demjson模块,该模块具有在非严格模式下解码的能力。

  • 我试图将一个报告从Google Ads API拉到Google sheets中,但我无法让API将我的查询识别为查询