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生成的,它真的非常強大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章