Python 中 json 序列化时,默认遇到中文会转换成 unicode,如果想要保留中文怎么办?

在Python中,json模块是一个非常重要的模块,它可以将Python对象序列化成json格式的字符串,也可以将json格式的字符串反序列化成Python对象。在序列化过程中,Python会将所有的字符串都转换成unicode编码,这样做是为了保证json格式的兼容性和可读性。但是有时候我们需要将中文字符串保留为中文,该怎么办呢?

首先,我们需要了解一下Python中json模块的两个重要函数:json.dumps()和json.loads()。其中,json.dumps()函数可以将Python对象序列化成json格式的字符串;json.loads()函数可以将json格式的字符串反序列化成Python对象。

默认情况下,json.dumps()函数会将中文字符串转换成unicode编码,如下所示:

import json

data = {'name': '张三', 'age': 18}
json_str = json.dumps(data)
print(json_str)

输出结果为:{“name”: “\u5f20\u4e09”, “age”: 18}

可以看到,json.dumps()函数默认将中文字符串转换成了unicode编码。

如果我们想要保留中文字符串,可以使用json.dumps()函数的ensure_ascii参数。该参数默认为True,表示将所有的非ASCII字符转换成unicode编码。如果我们将该参数设置为False,就可以保留中文字符串了,如下所示:

import json

data = {'name': '张三', 'age': 18}
json_str = json.dumps(data, ensure_ascii=False)
print(json_str)

输出结果为:{“name”: “张三”, “age”: 18}

可以看到,json.dumps()函数保留了中文字符串。

需要注意的是,如果我们将ensure_ascii参数设置为False,那么在反序列化时,就需要保证json格式的字符串中所有的非ASCII字符都是unicode编码。否则,json.loads()函数会抛出异常。例如,下面的代码就会抛出异常:

import json

json_str = '{"name": "张三", "age": 18}'
data = json.loads(json_str)
print(data)

输出结果为:json.decoder.JSONDecodeError: Invalid control character at: line 1 column 14 (char 13)

可以看到,json.loads()函数抛出了异常,因为json格式的字符串中包含了中文字符串,但是这些中文字符串并没有被转换成unicode编码。

因此,在使用ensure_ascii参数时,需要注意保证json格式的字符串中所有的非ASCII字符都是unicode编码。如果不确定json格式的字符串中是否包含中文字符串,可以先使用json.dumps()函数将Python对象序列化成json格式的字符串,再使用json.loads()函数将其反序列化成Python对象,以确保json格式的字符串中所有的非ASCII字符都是unicode编码。