.NET 6 新特性 System.Text.Json 中的 Writeable DOM

.NET 6 新特性 System.Text.Json 中的 Writeable DOM 特性

Intro

在 .NET 6 Preview 4 中,微软加入了 JSON Node 的支持,我们可以动态的编辑一个 JSON 文档,一个可以修改的 JSON 文档,就像 Newtonsoft.Json 里的 JToken,这样我们就可以更加灵活的操作一个 JSON 了。

主要新增的 API 如下:

  • JsonNode: JSON 文档中的一个节点,对应 Newtonsoft.Json 里的 JToken

  • JsonObject: JSON 对象,对应 Newtonsoft.Json 里的 JObject

  • JsonArray: JSON 数组,对应 Newtonsoft.Json 里的 JArray

  • JsonValue: JSON 中的一个值,对应 Newtonsoft.Json 里的 JValue

Sample

你可以使用 JsonNode.Parse("") 来将一个 JSON 转换成一个 JsonNode 对象,可以看下面的示例:

// Parse a JSON object
JsonNode jNode = JsonNode.Parse(@"{""MyProperty"":42}");
int value = (int)jNode["MyProperty"];
Debug.Assert(value == 42);
// or
value = jNode["MyProperty"].GetValue<int>();
Debug.Assert(value == 42);

你可以通过 AsObjectJsonToken 转换为 JsonObject,通过 AsArray 转换为 JsonArray,通过 AsValue 转换为 JsonValue

对于 JsonNode 或者 JsonValue 可以强制类型转成成期望的类型,如下所示,或者可以通过 GetValue 来转成类型,类似于 Newtonsoft.Json 里的 Value<T>() 扩展方法

// Parse a JSON object
var jNode = JsonNode.Parse(@"{""MyProperty"":42}").AsObject();
var jValue = jNode["MyProperty"].AsValue();
var value = (int)jValue;
Debug.Assert(value == 42);// or
value = jValue.GetValue<int>();
Debug.Assert(value == 42);

再来看一下修改 JSON 文档的一个示例:

var testObj = new {Name = "Ming", Age = 10};
var jsonString = JsonSerializer.Serialize(testObj);
var jsonNode = JsonNode.Parse(jsonString);
if (jsonNode is JsonObject jsonObject)
{jsonObject["Name"]?.GetValue<string>().Dump();jsonObject["Age"]?.GetValue<int>().Dump();jsonObject["Name"] = "Michael";jsonObject.ToJsonString().Dump();
}

Dump() 方法是封装的一个扩展方法,会把 value 打印到控制台,输出结果如下:

接着我们来看一个 JSON 数组的示例:

var testArrayJsonString = JsonSerializer.Serialize(new[]
{new {Name = "Ming", Age = 10}, new {Name = "Alice", Age = 6}, new {Name = "Anna", Age = 8}
});
jsonNode = JsonNode.Parse(testArrayJsonString);
if (jsonNode is JsonArray jsonArray)
{jsonArray.Select(item => $"{item["Name"]}, {item["Age"]}").StringJoin(Environment.NewLine).Dump();
}

输出结果如下:

接着我们再来看一个组合的示例:

var complexObj = new
{Name = "Mike", Users = new[]{new {Name = "Alice", Age = 6}, new {Name = "Anna", Age = 8}}
};
var jsonString = JsonSerializer.Serialize(complexObj);
jsonString.Dump();var jsonNode = JsonNode.Parse(jsonString);
jsonNode?["Users"]?.AsArray().Select(item => $"--{item["Name"]}, {item["Age"]}").StringJoin(Environment.NewLine).Dump();

输出结果如下:

另外一点想要提一下,就是现在有一点点 JSON Path 的支持,如果你有用过 SQL Server 里 JSON 查询的话一定对 JSON Path 有一定的了解,JSON Path 就像 XML Path,可以支持我们高效的找到对应的 JSON 节点,但是目前的支持并不好,也许正式如此,微软也并没有进行介绍,JsonNode 提供了 GetPath() 方法来获取当前 Node 对应的 JSON Path,但是现在对于根据 JSON Path 查询的支持还不行

jsonNode["Users"][0]["Name"].GetPath().Dump();
JsonNode.Parse(@"{""Prop1"":1}")["Prop1"].GetPath().Dump();

输出结果如下:

我们可以使用 SQL Server 来测试一下 JSON Path 是否正确,测试脚本如下:

DECLARE @json NVARCHAR(MAX) = '{"Name":"Mike","Users":[{"Name":"Alice","Age":6},{"Name":"Anna","Age":8}]}';SELECT JSON_VALUE(@json, '$.Users[0].Name')

查询结果如下:

如果可以支持 jsonNode[jsonPath] 来直接定位到某一个 Node 就很棒了,期待以后能够支持~~

但是目前暂时不会支持,还有一些别的优先级高的 task 并且可能会有一些性能方面的影响,所以很有 .NET 6 不会有这个 feature,可以参考文末的 issue

More

JsonNode 相关的 API 在 Preview5 的时候发生了一个 breaking change,命名空间从 System.Text.Json.Node 变成了 System.Text.Json.Nodes,如果从 Preview4 升级的时候需要注意一下。

References

  • https://github.com/dotnet/runtime/issues/47649

  • https://github.com/dotnet/runtime/issues/51937

  • https://github.com/dotnet/runtime/pull/52200

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

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

相关文章

ArcGISServer10安装与地图发布

1.安装ArcGISServer10前先启动IIS&#xff0c;并打开IIS管理器界面&#xff0c;检查是否已经安装好。2.新建一个自己的站点打开Internet信息服务&#xff08;IIS&#xff09;管理器&#xff0c;右击左侧的网站列表&#xff0c;选择——添加网站&#xff0c;如下图所示&#xff…

电影特效用到什么计算机知识,后期影视特效处理知识普及

电影特效作为电影产业中不可或缺的元素之一&#xff0c;为电影的发展做出了巨大的贡献。今天小编主要给大家分享后期影视特效处理知识普及&#xff0c;希望对你们有帮助!影视特效改变电影制作的方式在目前的电影制作过程中&#xff0c;从分镜头剧本开始&#xff0c;特效的理念已…

通达信版弘历软件指标_通达信软件指标编写基础教程,10个指标源码祝你股市一帆风顺...

一、基本函数HHV&#xff08;X,N&#xff09; N日内X的最高价LLV&#xff08;X,N&#xff09; N日内X的最低价VOL 成交量AND 和&#xff0c;表示同时满足MA&#xff08;X,N&#xff09; 移动平均线&#xff0c;5日均线可以写作MA&#xff08;CLOSE&#xff0c;5&#xff09;&am…

魔方内部长啥样?三维动画展示其结构,谁发明的真是个天才

全世界只有3.14 % 的人关注了青少年数学之旅魔方&#xff0c;英文名为Rubiks Cube&#xff0c;又叫鲁比克方块&#xff0c;最早是由匈牙利布达佩斯建筑学院厄尔诺鲁比克&#xff08;又称作厄尔诺卢比克&#xff09;教授于1974年发明的。魔方竞速是一项手部极限运动。咱们平时看…

[导入]ASP.NET中上传并读取Excel文件数据

首先&#xff0c;创建一个Web应用程序项目&#xff0c;在Web页中添加一个DataGrid控件、一个文件控件和一个按钮控件。<INPUT id"File1" type"file" name"File1" runat"server"><asp:Button id"Button1" runat&quo…

Hello Blazor:(2)集成Tailwind CSS续——nuget包方式

前段时间&#xff0c;写了一篇“Blazor如何集成Tailwind CSS”的文章。但是操作起来比较麻烦&#xff0c;又是命令行&#xff0c;又是要修改一大堆配置。后来&#xff0c;我又找到一个更简单的方法。实现方式新建Blazor项目&#xff0c;然后引用nuget包BamButz.MSBuild.Tailwin…

TCP连接——三次握手和四次断开

1.面向连接TCP是一个面向连接的协议&#xff0c;面向连接是指任何一方向对方发送数据前必须先建立通道&#xff0c;比如像打电话一样&#xff1a;必须要等到对方的手机响铃&#xff0c;并且对方接听电话时&#xff0c;才能与对方通信。而UDP则不是面向连接的协议&#xff0c;基…

30屏幕参数_顶级屏幕加持,一加8系列核心配置、屏幕参数官方公布

昨天&#xff0c;一加8系列官宣将于4月16日进行线上发布。届时&#xff0c;全新的一加8系列将正式到来。随着官宣的开启&#xff0c;一加手机也开始了新机的预热。参数配置上&#xff0c;一加官方剧透称&#xff0c;一加8系列全系标配骁龙865 5G旗舰级移动平台&#xff0c;全系…

陕西科技大学18计算机调剂,2018年陕西科技大学考研调剂信息公布

2018考研复试交流群(进群领内部资料) 5764338402018年陕西科技大学考研调剂信息公布2018年考研成绩查询接近尾声&#xff0c;部分成绩不太理想的考生可能会考虑考研调剂&#xff0c;为了方便考生&#xff0c;中公考研小编为大家整理了2018年陕西科技大学考研调剂信息公布&#…

垃圾软件!动不动就扣费!| 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅一、二、三、四、五、&#xff08;图源网络&#xff0c;侵权删&#xff09;我怀疑有人偷窥我生活↓ ↓ ↓

Effective C# 原则35:选择重写函数而不是使用事件句柄(译)

Effective C# 原则35&#xff1a;选择重写函数而不是使用事件句柄Item 35: Prefer Overrides to Event Handlers 很多.Net类提供了两种不同的方法来控制一些系统的事件。那就是&#xff0c;要么添加一个事件句柄&#xff1b;要么重写基类的虚函数。为什么要提供两个方法来完成同…

WPF实现统计图(饼图仿LiveCharts)

WPF开发者QQ群&#xff1a; 340500857 | 微信群 -> 进入公众号主页 加入组织欢迎转发、分享、点赞、在看&#xff0c;谢谢~。 01—效果预览效果预览&#xff08;更多效果请下载源码体验&#xff09;&#xff1a;一、PieControl.cs 代码如下 using System.Collections.Obje…

酷桌面:随身携带你的企业

需求背景&#xff1a;1.当前&#xff0c;很多企业把建设一个宣传型网站作为互联网宣传的第一步&#xff0c;在互联网上展示企业形象和主营业务&#xff0c;吸引浏览者关注其网站&#xff0c;从而达到促进销售、提升企业价值的作用。然而在移动端&#xff0c;不仅是将原有的PC网…

dataframe 修改某列_python dataframe操作大全数据预处理过程(dataframe、md5)

hive表的特征选择,不同表之间的join训练数据、测试数据的分开保存使用pandas进行数据处理显示所有列:pd.set_option(display.max_columns, None)显示所有行:pd.set_option(display.max_rows, None)单列运算:df[col2] = df[col1].map(lambda x: x**2)多列运算:df[col3] = d…

计算机实践教程采莲趣事,计算机基础作业采莲趣事

精品文档 . 忽然想起采莲的事情来了。采莲是江南的旧俗&#xff0c;似乎很早就有&#xff0c;而六朝时为盛&#xff1b;从诗歌里可以约略知道。采莲的是少年的女子&#xff0c;她们是荡着小船&#xff0c;唱着艳歌去的。采莲人不用说很多&#xff0c;还有看采莲的人。那是一个热…

那些曾经拥有的最大快乐,都是好奇心的结果

▲ 点击查看对于孩子们来说&#xff0c;强烈的好奇心和求知欲&#xff0c;是一种本能。在他们懵懵懂懂长大的过程中&#xff0c;总是对周围的世界充满着各种各样的疑问&#xff1a;“叶子为什么是绿色的&#xff1f;”“为什么花朵有那么多种颜色&#xff1f;”“蚂蚁为什么能…

[原]让链接点击过后无虚线

我以前还以为有难呢,在网上查资料,才知道这么简单, <a href"http://www.ktbbs.com"onfocus"this.blur()">转载于:https://www.cnblogs.com/Kennytian/archive/2007/03/31/695463.html

.net core 下使用StackExchange的Redis库访问超时解决

问题&#xff1a;并发稍微多的情况下Redis偶尔返回超时StackExchange的Redis类库&#xff0c;用的较多&#xff0c;但偶尔报的问题非常让人迷惑&#xff0c;访问超时&#xff0c;队列XXX…问题出在Redis服务器吗&#xff1f;可是其他应用访问都正常啊&#xff0c;难道要把这个类…

UML简易实践

2019独角兽企业重金招聘Python工程师标准>>> 面向对象的问题的处理的关键是建模问题。建模可以把在复杂世界的许多重要的细节给抽象出。许多建模工具封装了UML&#xff08;也就是Unified Modeling Language™&#xff09;&#xff0c;这篇课程的目的是展示出UML的精…

囊括计算机 电子信息仿真技术,什么是虚拟现实?

虚拟现实技术(英文名称&#xff1a;Virtual Reality&#xff0c;缩写为VR)&#xff0c;又称灵境技术&#xff0c;是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术于一体&#xff0c;其基本实现方式是计算机模拟虚拟环境从而给人以环境沉浸感…