.NET 6新特性试用之System.Text.Json功能改进

目录
  • 前言:
  • Demo
    • ​1.属性排序​
    • ​2.序列化通知​
  • 结论:

前言:

​​System.Text.Json​​作为.NET默认的JSON序列化和反序列化类库,让我们看看,在.NET 6中有哪些功能上的改进?

Demo

​1.属性排序​

在属性上声明​​JsonPropertyOrderAttribute​​来控制属性序列化的顺序,而以前,顺序是由反射顺序决定的,是不确定的。

示例代码如下:

public class User
{
    public int Age { get; set; }

    [JsonPropertyOrder(1)]
    public string Name { get; set; }
 
    [JsonPropertyOrder(-1)]
    public int Id { get; set; }
}

排序值较小的数字首先被序列化;没有声明属性的默认排序值为0:

{
  "Id": 1,
  "Age": 20,
  "Name": "My IO"
}

​2.序列化通知​

​​System.Text.Json​​新增了4个接口:

  • IJsonOnDeserialized
  • IJsonOnDeserializing
  • IJsonOnSerialized
  • IJsonOnSerializing

从名字上也可以看出它们的作用,即在序列化/反序列化前后被调用。

示例代码如下:

public class User :  IJsonOnSerialized, IJsonOnDeserialized
{
    public void OnDeserialized() => this.Validate(); // 反序列化后调用
    public void OnSerializing() => this.Validate(); // 序列化前调用

    private void Validate()
    {
        if (this.Age <= 0)
            throw new ArgumentException();
    }
}

结论:

  • ​“属性排序”功能有点鸡肋,目前还没碰到过需要指定排序的应用场景。​
  • ​“序列化通知”功能对于设置默认值和验证属性值合法性非常有用。​

到此这篇关于.NET 6新特性试用之System.Text.Json功能改进的文章就介绍到这了,更多相关 System.Text.Json功能改进内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • .NET 6中System.Text.Json的七个特性

    目录 忽略循环引用 序列化和反序列化通知 序列化支持属性排序 使用 Utf8JsonWriter 编写 JSON IAsyncEnumerable 支持 序列化支持流 像 DOM 一样使用 JSON 忽略循环引用 在 .NET 5 中,如果存在循环依赖, 那么序列化的时候会抛出异常, 而在 .NET 6 中, 你可以选择忽略它. Category dotnet = new() { Name = ".NET 6", }; Category systemTextJson = new() {

  • .NET 6新特性试用之System.Text.Json功能改进

    目录 前言: Demo ​1.属性排序​ ​2.序列化通知​ 结论: 前言: ​​System.Text.Json​​作为.NET默认的JSON序列化和反序列化类库,让我们看看,在.NET 6中有哪些功能上的改进? Demo ​1.属性排序​ 在属性上声明​​JsonPropertyOrderAttribute​​来控制属性序列化的顺序,而以前,顺序是由反射顺序决定的,是不确定的. 示例代码如下: public class User {     public int Age { get; set

  • .NET 6新特性试用之System.Text.Json功能改进

    目录 前言: Demo ​1.属性排序​ ​2.序列化通知​ 结论: 前言: ​​System.Text.Json​​作为.NET默认的JSON序列化和反序列化类库,让我们看看,在.NET 6中有哪些功能上的改进? Demo ​1.属性排序​ 在属性上声明​​JsonPropertyOrderAttribute​​来控制属性序列化的顺序,而以前,顺序是由反射顺序决定的,是不确定的. 示例代码如下: public class User {     public int Age { get; set

  • .NET 6新特性试用Timer类之PeriodicTimer 

    目录 前言: 一.Demo 结论: 前言: 在.NET中,已经存在了5个Timer类: System.Threading.Timer System.Timers.Timer System.Web.UI.Timer System.Windows.Forms.Timer System.Windows.Threading.DispatcherTimer 不管以前这样设计的原因,现在.NET 6又为我们增加了一个新Timer,​​PeriodicTimer​​. 这又是为什么呢? 一.Demo 与其他T

  • .NET 6新特性试用之常量内插字符串

    目录 前言: 一.常量内插字符串 结论: 前言: 编写代码时,我们常常需要组合字符串. 如下代码: string scheme = "https"; string host = "xxx.com"; int port = 8080; Console.WriteLine(string.Format("{0}://{1}:{2}", scheme, host, port)); 但是,这种替换方式容易会产生错误,比如写错参数顺序,索引数字无效等. 因此

  • .NET 6新特性试用之DateOnly和TimeOnly类型

    目录 前言: 举例 ​1.创建实例​ ​2.类型转换​ ​3.操作​ 结论: 前言: 在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟). 虽然我们可以使用DateTime类和TimeSpan类来代替,但是实际使用中会存在一些问题: var dateOnly = new DateTime(2021, 10, 1); //输出 2021/10/1 0:00:00 //问题:还是有时间,并不能代表0点出生 var timeOnly = new Ti

  • .NET 6新特性试用之Nuget包验证

    目录 前言: Demo 结论: 前言: 我们常常需要将.NET类库打包成Nuget包,以便多个项目公用. 一旦修改类库,​尽管代码可以运行​,并成功打包成新版本​,看起来一切正常​,​但是​你无法保证该更改是安全且兼容的. 而在.Net 6中,提供了包验证工具,帮助我们检测这一点. Demo 使用方式也非常简单,只需修改项目文件,加上​​EnablePackageValidation​​属性: <EnablePackageValidation>true</EnablePackageVal

  • .NET 6新特性试用之TryGetNonEnumeratedCount 方法

    目录 前言: 一.举例 二.原理 结论: 前言: .NET 6新增了​​TryGetNonEnumeratedCount​​方法,计算可枚举类型的元素总数. LINQ不是已经有了​​Count​​方法吗,为什么还要画蛇添足呢? 下文来看看具体情况!!! 一.举例 尝试下列代码: var b = new B<int>(); Console.WriteLine($@"{b.Count()}"); var a = new A<int>(); Console.Write

  • .NET 6新特性试用之DateOnly和TimeOnly类型

    目录 前言: 举例 ​1.创建实例​ ​2.类型转换​ ​3.操作​ 结论: 前言: 在.NET 6之前,没有方法来直接表示没有时间的日期(比如生日)或者没有日期的一天中的时间(比如闹钟). 虽然我们可以使用DateTime类和TimeSpan类来代替,但是实际使用中会存在一些问题: var dateOnly = new DateTime(2021, 10, 1); //输出 2021/10/1 0:00:00 //问题:还是有时间,并不能代表0点出生 var timeOnly = new Ti

  • .NET 6新特性试用之常量内插字符串

    目录 前言: 常量内插字符串 结论: 前言: 编写代码时,我们常常需要组合字符串. 如下代码: string scheme = "https"; string host = "xxx.com"; int port = 8080; Console.WriteLine(string.Format("{0}://{1}:{2}", scheme, host, port)); 但是,这种替换方式容易会产生错误,比如写错参数顺序,索引数字无效等. 因此,推

随机推荐