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(),load(),jump(),jumps())