Python和Java的序列化操作
1. Python的序列化
使用json.dumps()
方法对字典 {"content": "你好"}
进行序列化操作,下面分别演示 ensure_ascii=True
和 ensure_ascii=False
参数的效果。
示例代码如下:
import json
data = {"content": "你好"}
# 使用 ensure_ascii=True 进行序列化,将非ASCII字符转换为Unicode码点形式
json_str_ensure_ascii_true = json.dumps(data, ensure_ascii=True)
# 使用 ensure_ascii=False 进行序列化,保留非ASCII字符的原始形式
json_str_ensure_ascii_false = json.dumps(data, ensure_ascii=False)
print("ensure_ascii=True: ", json_str_ensure_ascii_true)
print("ensure_ascii=False: ", json_str_ensure_ascii_false)
运行上述代码,将得到以下输出:
ensure_ascii=True: {"content": "\u4f60\u597d"} # json.dumps方法默认情况下是转义的(ensure_ascii默认值为True)
ensure_ascii=False: {"content": "你好"}
在这个示例中,ensure_ascii=True
参数将非ASCII字符(中文 "你好")转换为 Unicode 码点形式(例如 "\u4f60\u597d"),而 ensure_ascii=False
参数则保留了非 ASCII 字符的原始形式(即 "你好")。
2. Java的序列化
在Java中,可以使用Jackson库对Map {"content": "你好"}
进行序列化操作,并分别使用 JsonWriteFeature.ESCAPE_NON_ASCII
为 true
和 false
进行演示。
首先,确保你已经添加了Jackson库的依赖。然后,示例代码如下:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.ObjectWriter;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) throws JsonProcessingException {
Map<String, String> data = new HashMap<>();
data.put("content", "你好");
ObjectMapper mapper = new ObjectMapper();
// 使用 JsonWriteFeature.ESCAPE_NON_ASCII 为 true 进行序列化,将非ASCII字符转换为Unicode码点形式
ObjectWriter writerWithEscapeNonAscii = mapper.writer()
.with(JsonWriteFeature.ESCAPE_NON_ASCII);
// 使用 JsonWriteFeature.ESCAPE_NON_ASCII 为 false 进行序列化,保留非ASCII字符的原始形式
ObjectWriter writerWithoutEscapeNonAscii = mapper.writer()
.without(JsonWriteFeature.ESCAPE_NON_ASCII);
String jsonWithEscapeNonAscii = writerWithEscapeNonAscii.writeValueAsString(data);
String jsonWithoutEscapeNonAscii = writerWithoutEscapeNonAscii.writeValueAsString(data);
System.out.println("With ESCAPE_NON_ASCII=true: " + jsonWithEscapeNonAscii);
System.out.println("With ESCAPE_NON_ASCII=false: " + jsonWithoutEscapeNonAscii);
}
}
运行上述代码,将得到以下输出:
With ESCAPE_NON_ASCII=true: {"content":"\u4f60\u597d"}
With ESCAPE_NON_ASCII=false: {"content":"你好"} # mapper.writeValueAsString方法默认情况下不转义
在这个示例中,JsonWriteFeature.ESCAPE_NON_ASCII
为 true
时,将非ASCII字符(中文 "你好")转换为 Unicode 码点形式(例如 "\u4f60\u597d")。而 JsonWriteFeature.ESCAPE_NON_ASCII
为 false
时,则保留了非 ASCII 字符的原始形式(即 "你好")。
3. 补充
Python Web项目, 居然全局使用转义模式进行序列化, 导致对接的Java项目总是无法成功调用接口(Python接口要求接收经过转义的数据,Java请求发送的是未经转义的数据 )。这个坑是我自己踩的,对比说明例子是使用ChatGPT生成的,它真的非常强大。