首页 / 问答 / [.NET Core].NET Core/.NET 5应用程序编程开发中使用System.Text.Json序列化时中文乱码如何解决?

[.NET Core].NET Core/.NET 5应用程序编程开发中使用System.Text.Json序列化时中文乱码如何解决?

0

如题,在.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 个回答

  • 0

    要更改JsonSerializer的转义行为,可以通过在JsonSerializerOptions上设置Encoder属性,将一个自定义JavascriptEncoder作为传递给JsonSerializer

    默认情况下,JsonSerializer出于深度的安全考虑,从而对字符串进行了过度的转义。所以,当使用JsonSerializer对中文进行默认序列化时,就会对中文字符进行转义。

    如果要在序列化时处理非拉丁语言的字母数字等字符,可以使用JavascriptEncoderCreate()方法来创建一个JsonSerializerOptions的编码器Encoder属性对象,并将这个JsonSerializerOptions对象作为JsonSerializer.Serialize();方法的可选参数,如下:

    运行结果为:

    这样做可以保持某些安全保护。例如,对HTML敏感的字符将继续被转义。比如:

    输出结果为:

    Rector的个人主页

    Rector

    2021-03-22 回答

    • 0

      当然,在不考虑任何安全性的情况下,你还可以使用System.Text.Encodings.Web.JavaScriptEncoder.UnsafeRelaxedJsonEscaping属性作为Encoder的值,如下:

      输出的结果为:

      从输出结果中可以看到,JavaScriptEncoder.UnsafeRelaxedJsonEscaping并未对HTML标签进行转义,这可能存在一些潜在的安全风险。

      Rector的个人主页

      Rector

      2021-03-22 回答

      我来回答