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

9f334c223e682d2f2c053324df954c4c.png

忽略循环引用

在 .NET 5 中,如果存在循环依赖, 那么序列化的时候会抛出异常, 而在 .NET 6 中, 你可以选择忽略它。

Category dotnet = new()
{Name = ".NET 6",
};
Category systemTextJson = new()
{Name = "System.Text.Json",Parent = dotnet
};
dotnet.Children.Add(systemTextJson);JsonSerializerOptions options = new()
{ReferenceHandler = ReferenceHandler.IgnoreCycles,WriteIndented = true
};string dotnetJson = JsonSerializer.Serialize(dotnet, options);
Console.WriteLine($"{dotnetJson}");public class Category
{public string Name { get; set; }public Category Parent { get; set; }public List<Category> Children { get; set; } = new();
}// 输出:
// {
//   "Name": ".NET 6",
//   "Parent": null,
//   "Children": [
//     {
//       "Name": "System.Text.Json",
//       "Parent": null,
//       "Children": []
//     }
//   ]
// }


序列化和反序列化通知

在 .NET 6 中,System.Text.Json 公开序列化和反序列化的通知。

有四个新接口可以根据您的需要进行实现:

•IJsonOnDeserialized•IJsonOnDeserializing•IJsonOnSerialized•IJsonOnSerializing

Product invalidProduct = new() { Name = "Name", Test = "Test" };
JsonSerializer.Serialize(invalidProduct);
// The InvalidOperationException is thrownstring invalidJson = "{}";
JsonSerializer.Deserialize<Product>(invalidJson);
// The InvalidOperationException is thrownclass Product : IJsonOnDeserialized, IJsonOnSerializing, IJsonOnSerialized
{public string Name { get; set; }public string Test { get; set; }public void OnSerialized(){throw new NotImplementedException();}void IJsonOnDeserialized.OnDeserialized() => Validate(); // Call after deserializationvoid IJsonOnSerializing.OnSerializing() => Validate();   // Call before serializationprivate void Validate(){if (Name is null){throw new InvalidOperationException("The 'Name' property cannot be 'null'.");}}
}


序列化支持属性排序

在 .NET 6 中, 添加了 JsonPropertyOrderAttribute 特性,允许控制属性的序列化顺序,以前,序列化顺序是由反射顺序决定的。

Product product = new()
{Id = 1,Name = "Surface Pro 7",Price = 550,Category = "Laptops"
};JsonSerializerOptions options = new() { WriteIndented = true };
string json = JsonSerializer.Serialize(product, options);
Console.WriteLine(json);class Product : A
{[JsonPropertyOrder(2)]  public string Category { get; set; }[JsonPropertyOrder(1)]  public decimal Price { get; set; }public string Name { get; set; }  [JsonPropertyOrder(-1)]  public int Id { get; set; }
}class A
{public int Test { get; set; }
}// 输出:
// {
//   "Id": 1,
//   "Name": "Surface Pro 7",
//   "Price": 550,
//   "Category": "Laptops"
// }

使用 Utf8JsonWriter 编写 JSON

.NET 6 增加了 System.Text.Json.Utf8JsonWriter,你可以方便的用它编写原始Json。

JsonWriterOptions writerOptions = new() { Indented = true, };using MemoryStream stream = new();
using Utf8JsonWriter writer = new(stream, writerOptions);writer.WriteStartObject();
writer.WriteStartArray("customJsonFormatting");
foreach (double result in new double[] { 10.2, 10 })
{writer.WriteStartObject();writer.WritePropertyName("value");writer.WriteRawValue(FormatNumberValue(result), skipInputValidation: true);writer.WriteEndObject();
}
writer.WriteEndArray();
writer.WriteEndObject();
writer.Flush();string json = Encoding.UTF8.GetString(stream.ToArray());
Console.WriteLine(json);static string FormatNumberValue(double numberValue)
{return numberValue == Convert.ToInt32(numberValue)? numberValue.ToString() + ".0": numberValue.ToString();
}// 输出:
// {
//    "customJsonFormatting": [
//      {
//        "value": 10.2
//      },
//      {
//        "value": 10.0
//      }
//  ]
// }

IAsyncEnumerable 支持

在 .NET 6 中, System.Text.Json 支持 IAsyncEnumerable

static async IAsyncEnumerable<int> GetNumbersAsync(int n)
{for (int i = 0; i < n; i++){await Task.Delay(1000);yield return i;}
}
// Serialization using IAsyncEnumerable
JsonSerializerOptions options = new() { WriteIndented = true };
using Stream 输出Stream = Console.OpenStandard输出();
var data = new { Data = GetNumbersAsync(5) };
await JsonSerializer.SerializeAsync(输出Stream, data, options);
// 输出:
// {
//    "Data": [
//      0,
//      1,
//      2,
//      3,
//      4
//  ]
// }// Deserialization using IAsyncEnumerable
using MemoryStream memoryStream = new(Encoding.UTF8.GetBytes("[0,1,2,3,4]"));
// Wraps the UTF-8 encoded text into an IAsyncEnumerable<T> that can be used to deserialize root-level JSON arrays in a streaming manner.
await foreach (int item in JsonSerializer.DeserializeAsyncEnumerable<int>(memoryStream))
{Console.WriteLine(item);
}
// 输出:
// 0
// 1
// 2
// 3
// 4

IAsyncEnumerable 的序列化的动图。

f0dc85fb1bc2b723f3c8d4ccc71b97e4.gif


序列化支持流

在 .NET 6 中, 序列化和反序列化支持流。

string json = "{\"Value\":\"Deserialized from stream\"}";
byte[] bytes = Encoding.UTF8.GetBytes(json);// Deserialize from stream
using MemoryStream ms = new MemoryStream(bytes);
Example desializedExample = JsonSerializer.Deserialize<Example>(ms);
Console.WriteLine(desializedExample.Value);
// 输出: Deserialized from stream// ==================================================================// Serialize to stream
JsonSerializerOptions options = new() { WriteIndented = true };
using Stream 输出Stream = Console.OpenStandard输出();
Example exampleToSerialize = new() { Value = "Serialized from stream" };
JsonSerializer.Serialize<Example>(输出Stream, exampleToSerialize, options);
// 输出:
// {
//    "Value": "Serialized from stream"
// }class Example
{public string Value { get; set; }
}

像 DOM 一样使用 JSON

.NET 6 添加了下面的新类型, 支持像操作 DOM 一样访问 Json 元素。

•JsonArray•JsonNode•JsonObject•JsonValue

// Parse a JSON object
JsonNode jNode = JsonNode.Parse("{\"Value\":\"Text\",\"Array\":[1,5,13,17,2]}");
string value = (string)jNode["Value"];
Console.WriteLine(value); // Text// or
value = jNode["Value"].GetValue<string>();
Console.WriteLine(value); // Textint arrayItem = jNode["Array"][1].GetValue<int>();
Console.WriteLine(arrayItem); // 5// or
arrayItem = jNode["Array"][1].GetValue<int>();
Console.WriteLine(arrayItem); // 5// Create a new JsonObject
var jObject = new JsonObject
{["Value"] = "Text",["Array"] = new JsonArray(1, 5, 13, 17, 2)
};
Console.WriteLine(jObject["Value"].GetValue<string>());  // Text
Console.WriteLine(jObject["Array"][1].GetValue<int>());  // 5// Converts the current instance to string in JSON format
string json = jObject.ToJsonString();
Console.WriteLine(json); // {"Value":"Text","Array":[1,5,13,17,2]}

全文完...

94adf512138d89e0bb2e7a0b28094f49.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293217.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis整合Spring结合使用缓存实例

林炳文Evankaka原创作品。转载请注明出处http://blog.csdn.net/evankaka 摘要&#xff1a;本文介绍了如何在Spring中配置redis&#xff0c;并通过Spring中AOP的思想&#xff0c;将缓存的方法切入到有需要进入缓存的类或方法前面。 一、Redis介绍 什么是Redis&#xff1f; redis…

读取无线手柄数据_xbox series x/s 手柄开箱

原标题&#xff1a;xbox series x/s 手柄开箱xbox series x/s 手柄开箱 2020-11-12 08:29:003点赞2收藏4评论小编注&#xff1a;此篇文章来自#原创新人#激励计划&#xff0c;新人发文前三篇文章&#xff0c;篇篇额外奖励50金币。参加超级新人计划活动&#xff0c;新人发文即可瓜…

豆瓣评分9.4!这一部纪录片,探秘中国人迹罕至的未至之境!

全世界只有3.14 % 的人关注了爆炸吧知识Bilibili 联合“美国国家地理”&#xff0c;悄悄出品了一部史诗级动物记录片&#xff0c;忍不住要推荐给大朋友小朋友们——《未至之境》。这部纪录片由B站和国家地理联合创作&#xff0c;从绵延万里的山脉高原到枝繁叶茂的雨林竹海&…

ssh无密码公钥登陆

根据自己的发展历程&#xff0c;回忆一下&#xff0c;之前接触到的都是密码用户登录&#xff0c;自从到了好孩子集团&#xff0c;感受了证书登录的情况&#xff0c;刚开始很抵触&#xff0c;超不习惯&#xff0c;而且当时对原理不了解&#xff0c;总是出错&#xff0c;给运维的…

使用OpenTelemetry搭配Zipkin构建NetCore分布式链路跟踪 | WebAPI + gRPC

OpenTelemetry介绍OpenTelemetry是一组标准和工具的集合&#xff0c;旨在管理观测类数据&#xff0c;如 trace、metrics、logs 等。通过标准化不同的应用程序和框架如何收集和发出可观察性遥测数据&#xff0c;OpenTelemetry旨在解决这些环境带来的一些挑战。OpenTelemetry包括…

C语言 linux环境基于socket的简易即时通信程序

转载请注明出处&#xff1a;http://www.cnblogs.com/kevince/p/3891033.html ——By Kevince 最近在看linux网络编程相关&#xff0c;现学现卖&#xff0c;就写了一个简易的C/S即时通信程序&#xff0c;代码如下&#xff1a; head.h 1 /*头文件&#xff0c;client和server…

腾讯云cloudlite认证_【腾讯云】考个证...大数据开发工程师认证

作为一个大数据行业的从业者&#xff0c;考个腾讯云大数据开发工程师认证总比考个消防证 easy 吧…&#xff1f;关于考这个认证的意义其实主要在于全面复习一下大数据相关的知识点&#xff0c;另外有个腾讯云的认证&#xff0c;也许大概也会对你找工作有点帮助的吧&#xff1f;…

Logistic回归主要应用领域

主要应用领域 1、预测是否发生、发生的概率&#xff08;流失、客户响应等预测&#xff09; 如果已经建立了logistic回归模型&#xff0c;则可以根据模型&#xff0c;预测在不同的自变量情况下&#xff0c;发生某病或某种情况的概率有多大。 2、影响因素、危险因素分析&#xff…

Java Process.waitFor()这个方法是做什么用的

java.lang.Process.waitFor()方法将导致当前的线程等待&#xff0c;如果必要的话&#xff0c;直到由该Process对象表示的进程已经终止。此方法将立即返回&#xff0c;如果子进程已经终止。如果子进程尚未终止&#xff0c;则调用线程将被阻塞&#xff0c;直到子进程退出。public…

kernel shell bash简介

还记得我们在Linux启动的时候。首先会启动内核 (kernel)&#xff0c;内核是一段计算机程序&#xff0c;这个程序直接管理管理硬件&#xff0c;包括CPU、内存空间、硬盘接口、网络接口等等。所有的计算机操作都要通过内核传递给硬件。为了我们方便调用内核&#xff0c;我们将内核…

最高调恋爱方式,简直“公开处刑”......

1 我拿到了剑桥的offer...▼2 当空乘专业第一次穿高跟鞋...▼3 是我没错了▼4 笑出鹅叫▼5 现场表演一下&#xff0c;一秒落汤鸡&#xff01;▼6 那个红/黄毛起来一下&#xff01;▼7 最高调的恋爱方式▼7 数学可以多好玩▼你点的每个赞&#xff0c;我都认真当成了喜欢

oracle6

概要文件管理用户资源create profile profile_name limitselect * from dba_profiles where profile order by limit;口令管理select * from dba_profiles where profile and resource_typepassword口令验证函数直接执行概要文件D:\app\Administrator\product\11.1.0\db_1\RDBM…

C# 扩展集合ObservableCollection使集合在添加、删除、值变更后触发事件

01—概述ObservableCollection继承了INotifyPropertyChanged接口&#xff0c;在属性变更时可以通知界面&#xff0c;当我把ObservableCollection集合绑定到界面的DataGrid后&#xff0c;我希望在界面修改表格数值后&#xff0c;可以触发一个 事件来验证我界面设定数据的有效性&…

数据挖掘算法之决策树算法总结

机器学习中&#xff0c;决策树是一个预测模型&#xff1b;它代表的是对象属性值与对象值之间的一种映射关系。树中每个节点表示某个对象&#xff0c;每个分叉路径则代表的某个可能的属性值&#xff0c;而每个叶结点则对应具有上述属性值的子对象。决策树仅有单一输出&#xff1…

微软职位内部推荐-SDEII

微软近期Open的职位:JD如果你想试试这个职位&#xff0c;请跟我联系&#xff0c;我是微软的员工&#xff0c;可以做内部推荐。发你的中英文简历到我的邮箱&#xff1a;Nicholas.lu.mail(at)gmail.com转载于:https://www.cnblogs.com/DotNetNuke/p/3891832.html

win7升级win10正式版_win7告退在即,如何升级到win10?

Win7即将停更&#xff0c;小伙伴们也差不多要进行自己系统的更新啦&#xff0c;今天小白就教大家如何将Win7升级到Win10第一步&#xff1a;首先在官网 www.xiaobaixitong.com 下载“小白软件”第二步&#xff1a;选好我们要下载的系统&#xff0c;然后安装即可。第三步&#xf…

C++容器的insert()函数有以下三种用法: 最终*it=val;

C容器的insert()函数有以下三种用法: 最终*itval; //用法1:在指定位置it前“插入”值为val的元素,返回指向这个元素的迭代器, iterator insert( iterator it, const TYPE &val ); //用法2:在指定位置it前“插入”num个值为val的元素 void insert( iterator it, si…

在24小时内学完所有的数学是种什么体验?我们做了这个大胆的尝试……

全世界只有3.14 % 的人关注了爆炸吧知识人还好就是没了而已其实&#xff0c;在此时&#xff0c;还有一件事情发生了。22:00&#xff0c;我们发出了这篇文章&#xff0c;不仅将2600多年的数学简史浓缩成24小时&#xff0c;还将2600多年数学简史浓缩成54张卡牌。每张卡牌背后都有…

Server Develop (八) IOCP模型

IOCP模型 IOCP全称I/O Completion Port&#xff0c;中文译为I/O完成端口。IOCP是一个异步I/O的Windows API&#xff0c;它可以高效地将I/O事件通知给应用程序&#xff0c;类似于Linux中的Epoll。 简介 IOCP模型属于一种通讯模型&#xff0c;适用于Windows平台下高负载服务器的一…

理解RESTful架构

2019独角兽企业重金招聘Python工程师标准>>> 原文&#xff1a;http://www.ruanyifeng.com/blog/2011/09/restful.html?20160826000527 越来越多的人开始意识到&#xff0c;网站即软件&#xff0c;而且是一种新型的软件。 这种"互联网软件"采用客户端/服务…