今天在用System.Text.Json序列化的时候遇到了中文序列化的一个问题,示例如下:
JsonSerializer.Serialize(new {Name = "你好"});
预期结果是: {"Name":"你好"},但得到结果如下:{"Name":"\u4F60\u597D"} 。虽然不影响功能,但大大的影响了可读性
找了一下,默认模式下对HTML敏感字符是不转义的,防止造成WEB安全问题,仅允许UnicodeRanges.BasicLatin的编码,我们如果需要对中文也转义的话,则需要指定JsonSerializerOptions的Encoder
var option = new JsonSerializerOptions()
{
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
var json = JsonSerializer.Serialize(new {Name = "你好"}, option);
不过这个Encoder是包含所有字符集的,它等价于JavaScriptEncoder.Create(UnicodeRanges.All),这个也是为啥它带一个Unsafe的原因,我们可以自己创建一个范围小点的Encoder,
var option = new JsonSerializerOptions()
{
Encoder = JavaScriptEncoder.Create(UnicodeRanges.BasicLatin, UnicodeRanges.CjkUnifiedIdeographs)
};