曹耘豪的博客

Python json的Expecting ',' delimiter报错

这个json应该是控制台打印出来的或者浏览器显示的的,所以如果value有"引号时,输出时会添加转义符。如:

1
{"key":"\"value\""}

上述json复制到网站格式化是正常的,但如果直接粘贴到代码里就会有报错

1
2
3
4
5
6
7
8
9
10
11
>>> import json
>>> json.loads('{"key":"\"value\""}')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python@3.9/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py", line 346, in loads
return _default_decoder.decode(s)
File "/usr/local/Cellar/python@3.9/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/local/Cellar/python@3.9/3.9.12/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 10 (char 9)

是因为此时的\是转义符,相当于输入了{"key":""value""},自然是个不合法json。我们需要的是json里的转义符而不是python字符串的转义符,所以再添加一个\,如下:

1
2
3
>>> import json
>>> json.loads('{"key":"\\"value\\""}')
{'key': '"value"'}

这样就可以了。但如果json很大,手动逐个添加\并不现实,字符串替换也不方便,我们可以在字符串前加r,使用原始字符串文本

1
2
3
>>> import json
>>> json.loads(r'{"key":"\"value\""}')
{'key': '"value"'}

也可以先把源json写到文件里,再读,因为文件里的\就不再是转义符了

1
2
3
4
5
6
7
8
>>> import json
>>> with open('data.txt') as f:
... json.load(f)
...
{'key': '"value"'}

➜ cat data.txt
{"key":"\"value\""}

参考:

   /