[.NET Core].NET Core/.NET 5应用程序编程开发中使用System.Text.Json序列化时中文乱码如何解决?
2.75K 次浏览
如题,在.NET 5/.NET Core的应用程序编程开发中,当我们使用Syste.Text.Json命名空间对某对象obj
进行序列化操作JsonSerializer.Serialize(obj)
时,如果此obj
对象属性值中包含中文,默认情况下,序列化得到的字符串结果中的中文并不是原文而是被转义了的字符,比如:
using System;
using System.Text.Json;
namespace EsSample
{
public class Program
{
public static void Main()
{
var a = new A
{
Name = "这是一段未被转义的中文。"
};
var s = JsonSerializer.Serialize(a);
Console.WriteLine(s);
}
}
class A {
public string Name {get; set;}
}
}
运行输出的序列化JSON字符串结果为:
{"Name":"\u8FD9\u662F\u4E00\u6BB5\u672A\u88AB\u8F6C\u4E49\u7684\u4E2D\u6587\u3002"}
但期望的序列化为:
{"Name":"这是一段未被转义的中文。"}
那么,在.NET 5/.NET Core应用程序编程开发中,应该如何解决System.Text.Json命名空间在默认情况下序列化中文被转义的问题呢?
2 个回答
-
要更改
JsonSerializer
的转义行为,可以通过在JsonSerializerOptions
上设置Encoder
属性,将一个自定义JavascriptEncoder
作为传递给JsonSerializer
。默认情况下,
JsonSerializer
出于深度的安全考虑,从而对字符串进行了过度的转义。所以,当使用JsonSerializer
对中文进行默认序列化时,就会对中文字符进行转义。如果要在序列化时处理非拉丁语言的字母数字等字符,可以使用
JavascriptEncoder
的Create()
方法来创建一个JsonSerializerOptions
的编码器Encoder
属性对象,并将这个JsonSerializerOptions
对象作为JsonSerializer.Serialize();
方法的可选参数,如下:运行结果为:
这样做可以保持某些安全保护。例如,对HTML敏感的字符将继续被转义。比如:
输出结果为: