Skip to content

Instantly share code, notes, and snippets.

@mrluanma
Last active January 12, 2016 06:26
Show Gist options
  • Save mrluanma/b2a865060af7ca47afa5 to your computer and use it in GitHub Desktop.
Save mrluanma/b2a865060af7ca47afa5 to your computer and use it in GitHub Desktop.

JSON 支持 UTF-8 编码的 string

我们的好多地方都使用了一行一个 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))

用 fileinput 写 Unix filter

用 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
["你好"]

使用 functools.partial 绑定部分参数

当项目中有 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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment