【发布时间】:2015-09-22 22:59:49
【问题描述】:
考虑这个有效的 json:
{"a": 1, "b": "{\"c\":2}"}
Python 的 json 模块在我尝试解析它时抛出 - 看起来 \" 正在抛出它:
有没有办法在 Python 中解析这个,无论是使用 json 模块还是其他一些模块,如 ujson?
【问题讨论】:
考虑这个有效的 json:
{"a": 1, "b": "{\"c\":2}"}
Python 的 json 模块在我尝试解析它时抛出 - 看起来 \" 正在抛出它:
有没有办法在 Python 中解析这个,无论是使用 json 模块还是其他一些模块,如 ujson?
【问题讨论】:
实际上,转义双引号并不重要。看我的测试:
>>> json.loads('{"a": 1, "b": "{\"c\":2}"}')
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.4/json/decoder.py", line 359, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting ',' delimiter: line 1 column 18 (char 17)
>>> json.loads('{"a": 1, "b": "{"c":2}"}')
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/usr/lib/python3.4/json/__init__.py", line 318, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.4/json/decoder.py", line 343, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.4/json/decoder.py", line 359, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Expecting ',' delimiter: line 1 column 18 (char 17)
>>> json.loads('{"a": 1, "b": {"c":2}}')
{'a': 1, 'b': {'c': 2}}
>>> json.loads('{"a": 1, "b": {\"c\":2}}')
{'a': 1, 'b': {'c': 2}}
>>>
【讨论】:
在带引号的字符串中,\" 被视为与常规引号相同:
>>> '{"a": 1, "b": "{\"c\":2}"}'
'{"a": 1, "b": "{"c":2}"}'
因此,您的字符串不是有效的 JSON。
您还需要转义反斜杠,以便将它们发送到loads。您可以通过使用dumps 对所需的字典进行编码来查看这一点:
>>> json.dumps({"a": 1, "b": "{\"c\": 2}"})
'{"a": 1, "b": "{\\"c\\": 2}"}'
>>> json.loads('{"a": 1, "b": "{\\"c\\": 2}"}')
{u'a': 1, u'b': u'{"c": 2}'}
【讨论】:
json.loads(r'{"a": 1, "b": "{\"c\":2}"}').