【问题标题】:unable to parse json content with error `expecting property name enclosed`无法解析 json 内容并出现错误“期望包含属性名称”
【发布时间】:2016-03-14 15:53:24
【问题描述】:

我正在从数据库中获取 json 格式的文本。基本上将 api 内容从网站转储到带有 TEXT 字段的数据库。

我可以看到 json 内容没有问题/错误,但是当我这样做时..

try:
    get_all = db.query("SELECT id, name, api_content FROM _books")
    _result = get_all.fetchall()
except Exception as e:
    print("[e::line-163] ", e)

try:
    for r in _result:
        api_content = r[2]
        j = json.loads(api_content)
        print('names, ', j['names'])

我收到此错误。

期望用双引号括起来的属性名称:第 1 行第 2 列(字符 1)

api_content 没有问题,它是格式正确的 json 内容。

【问题讨论】:

    标签: python json python-3.x


    【解决方案1】:

    我认为您在 api_content 中没有有效的 JSON。从错误的内容来看,您的属性(键)用单引号括起来,但需要用双引号括起来才能成为有效的 JSON。

    这是正在发生的事情:

    >>> import json
    >>> json.loads('{"key": "value"}')  # <- VALID JSON
    {'key': 'value'}
    >>> json.loads("{'key': 'value'}")  # <- INVALID JSON
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/__init__.py", line 319, in loads
        return _default_decoder.decode(s)
      File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 339, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
      File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/json/decoder.py", line 355, in raw_decode
        obj, end = self.scan_once(s, idx)
    json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
    

    换句话说,您应该修改将 API 内容转储到数据库的方式。看起来您只是在编写 Python 字典对象的字符串表示,而不是使用 json.dumps()

    如果您无法更改,请尝试使用ast.literal_eval() 安全地评估 api 内容:

    from ast import literal_eval
    
    for r in _result:
        api_content = r[2]
        j = literal_eval(api_content)
        print('names, ', j['names'])
    

    【讨论】:

    • 我想这可能是它,我只是数据库,一切都在单引号中。有没有办法解决这个问题?
    • @soni-b3196413 我会修改/修复您将 api 内容转储到数据库中的方式(json.dump(s) 正确)。如果无法更改,可以尝试通过ast.literal_eval() 加载 api 内容。
    • 那么,您是说有一种方法可以在将api_content 提交到数据库之前使用json.dump 修复引号?如果是这样,那会更好,因为我将尝试替换字符串 .. 这将是很多工作。你能举个例子吗?对不起,我在 python 中是 0
    • @soni-b3196413 我已在答案中添加了更多信息 - 请查看。
    • 非常感谢。它有效,不确定ast 是否不好,但我稍后会阅读。
    猜你喜欢
    • 2019-08-06
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    相关资源
    最近更新 更多