Python和Java的序列化操作

1. Python的序列化

使用json.dumps()方法对字典 {"content": "你好"} 进行序列化操作,下面分别演示 ensure_ascii=Trueensure_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_ASCIItruefalse 进行演示。

首先,确保你已经添加了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_ASCIItrue 时,将非ASCII字符(中文 "你好")转换为 Unicode 码点形式(例如 "\u4f60\u597d")。而 JsonWriteFeature.ESCAPE_NON_ASCIIfalse 时,则保留了非 ASCII 字符的原始形式(即 "你好")。

3. 补充

Python Web项目, 居然全局使用转义模式进行序列化, 导致对接的Java项目总是无法成功调用接口(Python接口要求接收经过转义的数据,Java请求发送的是未经转义的数据 )。这个坑是我自己踩的,对比说明例子是使用ChatGPT生成的,它真的非常强大。

posted @ 2023-07-22 00:40  又是火星人  阅读(175)  评论(0编辑  收藏  举报