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