我们的好多地方都使用了一行一个 JSON 对象的格式,并且这个 JSON 里一般含有中文,默认 Python 的 json.dumps 会对中文进行转义。也就是说:
In [2]: print(json.dumps(['我', '爱', 'Python']))
["\u6211", "\u7231", "Python"]
其实JSON 的 string 编码默认情况下就是 UTF-8,我们可以明确要求 json.dumps 不转义 ASCII 之外的字符。
In [3]: print(json.dumps(['我', '爱', 'Python'], ensure_ascii=False))
["我", "爱", "Python"]
下面是一个把转义后的 JSON 转换成 UTF-8 编码的 JSON 的工具。
import json
import fileinput
for l in fileinput.input():
print(json.dumps(json.loads(l), ensure_ascii=False))
用 Python 写Unix filter 的时候可以使用标准库里的 fileinput 模块。
只需要写上面那 4 行代码,就可以这样使用它:
$ echo '["\u4f60\u597d"]' | python3 filter.py
["你好"]
$ echo '["\u4f60\u597d"]' | python3 filter.py > hello.json
$ python3 filter.py hello.json
["你好"]
$ python3 filter.py < hello.json
["你好"]
当项目中有 20 多个 json.dumps
需要添加 ensure_ascii=False
怎么办?我的做法是这样:把全部 json.dumps
替换成 json_dumps
, 然后在 utils.py
里放进去下面这两行:
from functools import partial
json_dumps = partial(json.dumps, ensure_ascii=False, sort_keys=True)