.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;从绵延万里的山脉高原到枝繁叶茂的雨林竹海&…

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

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

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

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

kernel shell bash简介

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

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

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

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

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

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

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

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

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

在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;而且是一种新型的软件。 这种"互联网软件"采用客户端/服务…

凡是过往,皆为序章。

凡是过往&#xff0c;皆为序章今天是元旦假期的最后一天&#xff0c;这三天我一直在想&#xff0c;21年的年终总结应该如何下笔。其实心里面想表达和记录的事情很多&#xff0c;可当真正坐在电脑前时&#xff0c;却发现没有头绪。贵有恒&#xff0c;何必三更起五更眠。最无益&a…

查看操作系统版本linux_LINUX操作系统常用操作收录(二):查看文件内容命令小结...

先整体了解一下如何查看文件内容的命令vi 兼有修改功能的查看方式&#xff0c;会单独打开整个文件vim 可修改文件内容并且显示当前查看位置在文件中的%多少cat 由第一行开始显示内容&#xff0c;并将所有内容输出tac 从最后一行倒序显示内容&#xff0c;并将所有内容输出more…

crond定时任务详细分析

一、定时任务crond的介绍 crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。一般情况下&#xff0c;我们安装文成系统之后&#xff0c;默认变回启动crond任务调度服务&#xff0c;crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作。…

OCS2007R2升级LyncSrv2013 PART4:关联边缘

完成拓扑的合并后&#xff0c;由于边缘服务器尚未做迁移和升级&#xff0c;所以此时我们的Lync Server没有边缘服务、联盟路由等。我们就可以把OCS的边缘服务器与Lync Server前端进行关联&#xff0c;暂时使用OCS的联盟路由和边缘服务。要关联OCS边缘服务器&#xff0c;需要打开…

2021技术文大盘点 | 打包过去,​面向未来

先用四句诗词快速描述 一下我的写作心得1. 只在此山中&#xff0c;云深不知处作为开发人员&#xff0c;常执着于机器0,1代码&#xff0c;非假既真&#xff1b;真实世界是很主观的&#xff0c;需要精致细节&#xff0c;更多时候需要全局把控。带着问题写作&#xff0c;对事物理解…

Ansible 一步一步从入门到精通(一)

一&#xff1a;安装ansiblemac&#xff1a;1. 安装 Homebrew (get the installation command from the Homebrew website).2. 安装Python 2.7.x ( brew install python ).3. 安装 Ansible ( sudo pip install ansible ).linux&#xff1a;如果系统中安装了python-pip和python-d…