【问题标题】:Why does json.loads() work on some strings? [duplicate]为什么 json.loads() 对某些字符串起作用? [复制]
【发布时间】:2017-05-10 11:13:18
【问题描述】:

我有一个类似于json1 中所示的 JSON 字符串。我正在尝试将其解析为 JSON,但它似乎不起作用。出了什么问题?

import json

string1 = "[]"
list1 = "['hi','bye']"
json1 = "{'genre': ['Action', 'Comedy']}"

print json.loads(string1)
print json.loads(list1)
print json.loads("{'genre': ['Action', 'Comedy']}")

它给了我错误

Traceback (most recent call last):
  File "python", line 8, in <module>
ValueError: No JSON object could be decoded

【问题讨论】:

  • list1 不是 json 格式
  • 因为它们不是有效的 json...json.org,所以 JSON 字符串应该被双引号 print json.loads('{"genre": ["Action", "Comedy"]}')

标签: python json


【解决方案1】:

JSON(不同于 JavaScript 或 Python)only allows double-quoted strings.

>>> print json.loads('["hi","bye"]')
[u'hi', u'bye']

>>> print json.loads("['hi','bye']")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 366, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 384, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

正因为如此,并且由于 Python 倾向于使用 引用的字符串,Python 对象的 repr() 几乎总是 invalid JSON。您必须改用json.dumps()

>>> v = ["hi", "bye"]
>>> repr(v)
"['hi', 'bye']"
>>> json.dumps(v)
'["hi", "bye"]'

【讨论】:

    【解决方案2】:

    json 需要双引号字符串,你有单引号字符串。您可以使用ast.literal_eval 加载字符串:

    import ast
    print(ast.literal_eval("{'genre': ['Action', 'Comedy']}"))
    

    结果:

    {'genre': ['Action', 'Comedy']}
    

    【讨论】:

    • 哦,太好了!呸,这么小的细节。谢谢。
    猜你喜欢
    • 2020-10-19
    • 2021-11-20
    • 2012-03-30
    • 2016-11-30
    • 1970-01-01
    • 2021-02-09
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多