Python json.loads ValueError,期望分隔符

时间:2015-01-29 19:44:56

标签: python json python-2.7

我正在以json的形式提取postgres表。输出文件包含以下行:

{"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或其他什么?

4 个答案:

答案 0 :(得分:21)

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

>>> 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本身完成的。

答案 1 :(得分:6)

试试这个:

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

如果变量中包含该字符串,则只需:

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

希望它有所帮助!

答案 2 :(得分:0)

尝试使用[{1}}或将其作为方式,因为来源中的source.replace('""', '')会使""无法区分它们。

答案 3 :(得分:-1)

对于我的实例,我写道:

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

并且像护身符一样工作。