Python json.loads ValueError,需要分隔符

Posted

技术标签:

【中文标题】Python json.loads ValueError,需要分隔符【英文标题】:Python json.loads ValueError, expecting delimiter 【发布时间】:2015-03-29 04:22:22 【问题描述】:

我将一个 postgres 表提取为 json。输出文件包含如下行:

"data": "test": 1, "hello": "I have \" !", "id": 4

现在我需要使用json.loads 将它们加载到我的python 代码中,但是我收到了这个错误:

Traceback (most recent call last):
  File "test.py", line 33, in <module>
    print json.loads('''"id": 4, "data": "test": 1, "hello": "I have \" !"''')
  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 365, 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 381, in raw_decode
    obj, end = self.scan_once(s, idx)
ValueError: Expecting , delimiter: line 1 column 50 (char 49)

我发现解决方法是将另一个\ 添加到\"。所以,如果我通过了

"data": "test": 1, "hello": "I have \\" !", "id": 4

json.loads,我明白了:

u'data': u'test': 1, u'hello': u'I have " !', u'id': 4

有没有办法在不添加额外的\ 的情况下做到这一点?比如向json.loads 传递参数之类的?

【问题讨论】:

嘿伙计们,我有同样的问题任何有效的解决方案? 【参考方案1】:

试试这个:

json.loads(r'"data": "test": 1, "hello": "I have \" !", "id": 4')

如果您在变量中包含该字符串,那么只需:

json.loads(data.replace("\\", r"\\"))

希望对你有帮助!

【讨论】:

恐怕不行,'"data": "test": 1, "hello": "I have \" !", "id": 4''"data": "test": 1, "hello": "I have \" !", "id": 4'.replace("\\", r"\\")一模一样。 @AliBZ 它不起作用,因为您在字符串之前缺少r。复制并粘贴我的第一个示例,这样就可以了。 我的字符串在一个变量中,这就是我使用你的第二个例子的原因。 @AliBZ 好的,所以唯一的方法是使用replace手动将"替换为\\"【参考方案2】:

您可以指定所谓的“原始字符串”:

>>> print r'"data": "test": 1, "hello": "I have \" !", "id": 4'
"data": "test": 1, "hello": "I have \" !", "id": 4

他们不解释反斜杠。

通常的字符串将\" 更改为",因此您可以在字符串中包含" 字符,这些字符本身由双引号限制:

>>> "foo\"bar"
'foo"bar'

所以从\"" 的转换不是由json.loads 完成的,而是由Python 本身完成的。

【讨论】:

我正在逐行读取数据文件。所以我有变量中的字典。我试过.replace("\\", r"\\").encode('string-escape'),都不管用。 在 JSON 中 "\"" 也意味着 '"',就像在 Python 中一样。如果输入文件中有\",它实际上是"。如果您出于某种原因想要拥有r'\"',则需要.replace('"', '\\"')【参考方案3】:

试试source.replace('""', '')或者sub的方式,因为源中的""会让json.loads(source)无法区分。

【讨论】:

【参考方案4】:

以我为例,我写道:

STRING.replace("': '", '": "').replace("', '", '", "').replace("'", '"').replace("'", '"').replace("': \"", '": "').replace("', \"", '", "').replace("\", '", '", "').replace("'", '\\"')

并且像魅力一样工作。

【讨论】:

我不知道,为什么你投了反对票。我试过你的,它奏效了。【参考方案5】:

尝试使用三引号 r""",不需要考虑 \ 的东西。

json_string = r"""

    "jsonObj": []

"""
data = json.loads(json_string)

【讨论】:

以上是关于Python json.loads ValueError,需要分隔符的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中处理 json.loads() 值错误

Python json.loads()

python json (loads(),load(),jump(),jumps())

python——json.loads避坑

使用 python json.loads 解析 unicode 输入

Python 的 json.loads 的数据输入必须是啥格式?