我正在以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
或其他什么?
答案 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("'", '\\"')
并且像护身符一样工作。