Newtonsoft.Json这个包想必都很熟悉了

不管是序列化对象(对象转Json),还是反序列化对象(Json转对象)这都是最常用的第三方Nuget包

但如果需要的功能仅限于此的话,不妨试试微软内置的System.Text.Json

可以查看教程将 Newtonsoft.Json 与 System.Text.Json 比较,并迁移到 System.Text.Json

下面用Newtonsoft.Json举个例子

class Person
{
    public int Id { get; set; }

    public string Name { get; set;}
}
static void Main()
{
    var person = new Person
    {
        Id = 1,
        Name = "张三"
    };
    Console.WriteLine("Newtonsoft.Json:{0}",JsonConvert.SerializeObject(person));
    Console.WriteLine("System.Text.Json:{0}", System.Text.Json.JsonSerializer.Serialize(person));
    Console.ReadKey();
}

控制台的结果

Newtonsoft.Json:{"Id":1,"Name":"张三"}
System.Text.Json:{"Id":1,"Name":"\u5F20\u4E09"}

System.Text.Json默认是会转义的,参考如何使用 System.Text.Json 自定义字符编码

将代码添加配置

var options = new JsonSerializerOptions
{
    // 若要序列化所有语言集而不进行转义,请使用 UnicodeRanges.All
    Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
};
Console.WriteLine("带配置的System.Text.Json:{0}", System.Text.Json.JsonSerializer.Serialize(person, options));

控制台的结果

带配置的System.Text.Json:{"Id":1,"Name":"张三"}

如果出现字段定义为大写,但是Json中为小写可以参考对所有 JSON 属性名称使用 camel 大小写

既然是差异当然不可以只举一个例子

现在我们修改刚刚Person类中的Name字段

class Person
{
    public int Id { get; set; }

    /// <summary>
    /// 去掉了get;set;访问器
    /// </summary>
    public string Name;
}

控制台的结果

Newtonsoft.Json:{"Name":"张三","Id":1}
System.Text.Json:{"Id":1}

Newtonsoft.Json有个细微的变化,没有get;set;访问器的字段调整到了前面

而System.Text.Json直接不给Name字段赋值了甚至Json中不存在这个字段了


被这风吹散的人说Ta爱的不深,被这雨淋湿的人说Ta不会冷