详解.NET Core 3.0 里新的JSON API_实用技巧

来源:脚本之家  责任编辑:小易  

军车,在世界陆军作战中起到运送弹药、粮秣、伤病员,纵深突击以及保障防卫等突出作用的车辆。在世界各大战争和演习中,均担负长途机动,摩托化行军任务,是陆军必不可缺的行军工具。至于说军官不可以驾驶军车是存在的,而不是大家所理解的军官不能开车,这个问题是因为之前曝光了不少军官驾驶军车利用特权通过高速公路、过桥、停车不交费等情况,人们常常看到各种军车利用特权违章、出没于商店购物、景点旅游、酒店吃饭等地,其实大部份并不非严格意义上的军车,只能说是军牌车,但目前,在军车管理方面确实存在一些漏洞为了避免不良影响在某些大军区规定,士兵不可以单独驾车,必须由军官带车,士官都没有带车的权利,军官是不可以开车的。其实

为什么需要新的 JSON API ?

“队魂\"应该就是一支球队的灵魂,在他身上可以反映出球队的特点,可以体现出球队的精气神,球队会因他的存在和不存在而变得不同的两个样,如果细分的话,我觉得应该还可以分为两种队魂,一种的话是战术上的,一种是精神上的,当然也有两种并存的情况出现。这样的队魂,我第一个想到的毫无疑问是1986年世界杯的阿根廷队,马拉多纳是那支球队无可争议的灵魂,无论是精神上还是战术上他都是绝对的领袖!战术上:那届大赛的7场比赛中,阿根廷队共打进14个进球,其中13个进球都和马拉多纳息息相关。马拉多纳攻入5球、助攻5次,一个人直接成就了其中的10球!并间接参与了另外3球!1986年世界杯是一种战术的成功,阿根廷主帅比拉尔

JSON.NET  大家都用过,老版本的 ASP.NET Core 也依赖于 JSON.NET 。  

记得之前给大家分享过,喵星人嗅觉比味觉敏锐,因此什么东西拿到它们面前,喵星人一定都是先闻闻看再说!但不知道大家有没有发现,有时候喵星人闻完你的臭脚丫子或是其他猫咪的屁股之后,会露出一脸痴呆样呢?嘴巴半开、眼神发直,一脸被臭味儿给熏晕了的表情。其实这是猫咪闻到刺激性味道的自然反应,还有个专门的学术名词称为弗莱敏反应(FlehmenResponse)。猫咪除了用鼻子闻气味之外,在它们的上颚门牙后面还有两个小洞连接着接收味道的器官-犁鼻器,犁鼻器能帮助猫咪探察其他动物留下的体味,有利于发情期时追踪母猫的去向。因此,猫咪闻到味道强烈的气味时,会将嘴巴打开,让口腔内的小洞能吸收气味至犁鼻器。还有就是,食

然而这个依赖就会引起一些版本问题:例如 ASP .NET  Core某个版本需要使用 JSON .NET  v10 ,而另一个库需要使用 JSON.NET  v11 ;或者 JSON .NET   出现了一个新版本,而ASP .NET Core 还不能支持这个版本,而您却想使用该版本。  

糖尿病被誉为不死的癌症,虽然说没有致命性,但是对人体的伤害极大,而且对于饮食的要求较高。一般稍微含糖量较高的食物,都是不适合糖尿病人食用的,这的确是痛苦的事情,美食与糖尿病人几乎是绝缘的。但是也并非没有食物可以食用,说到糖尿病的天敌,那么就莫过于豆类蔬菜了。豆类是一种特别富有营养、非常健康的食物,它们含有高水平的B族维生素,钙、镁、钾等矿物质以及多种生物活性化合物,能够有助于身体产生能量、改善人体新陈代谢。而且,豆类也是一种“低血糖指数食物”,摄入之后血糖水平增长得非常缓慢,对于糖尿病的益处是很大的。可以做为糖尿病人的主要蔬菜,可以放心食用。尤其是以下五种豆子,糖尿病人是可以常吃,可以对抗糖尿

System.Text.Json  

随着 NET Core  3.0 的出现,出现了 System .Text.Json 命名空间和它下面一些用于处理 JSON 的类。  

特点

这个内置 JSON API 具有与生俱来的高性能、地分配的特点:  

JSON .NET  使用 .NET  里面的字符串作为基本数据类型,其实也就是 UTF16 ,而 .NET Core 中新的 JSON  API 直接使用数据原始的 UTF8 格式。  

新的 JSON API 基于 Span <byte> 这个数据类型来进行操作 JSON 数据,从而具有低分配的特点,这就可以极大的改善吞吐量和内存使用情况。  

但是新的JSON API 的特性还不那么丰富,有一些 JSON .NET 具有的特性都还不支持。  

例子  

随便找了一个 JSON 示例文件:  

针对这个文件,需要修改一下它的属性:

Utf8JsonReader  

先使用   Utf8JsonReader  来读取JSON文件。  

Utf8JsonReader   并不会读取文件或者 stream ,它会读取Span数据类型。  

直接上代码:

Main方法里面,我们使用 File .ReadAllBytes 从 sample .json 文件读取数格式为 byte[] ,然后通过 AsSpan 这个扩展方法将其转化为 Span <byte> 数据类型,然后把它传递到   Utf8JsonReader  的构造函数来创建一个JSON的 reader 。  

接下来使用while循环对JSON数据的每个 Token 进行读取,每次执行 Read() 方法时, reader 就会移动到 JSON 数据里面的下一个 Token 那里。  

Token 分成几种类型, GetToken Info 方法就是判断一下 Token 的类型,并返回一些描述性信息,这里面应该是包含了所有的类型。这里面使用到了C#  8  的  switch  表达式。  

运行程序

结果如下:

可以看到 sample.json 文件里面的每个 Token 都被正确的显示了。  

Json Document 类  

Json Document 是基于 Utf8JsonReader  构建的 。 JsonDocument  可分析  JSON  数据并生成只读文档对象模型  (DOM) ,可对模型进行查询,以支持随机访问和枚举。使用  JsonDocument  分析常规  JSON  有效负载并访问其所有成员比使用  Json.NET  快  2-3  倍,且为合理大小(即  < 1 MB )的数据所分配的量非常少。  

JsonDocument 可以处理 Span ,也可以处理 Stream 。  

例子:

这里我通过 File .OpenRead 把 json 文件转化为 stream 。然后使用 Json Document.Parse 方法把 stream 解析成 JSON 文档对象模型。  

注意,这里我使用了 C# 8 的 using var 语法,这个以后再说。  

下面我们开始从这个 JSON 文档对象模型的根节点开始遍历,也就是 RootElement :  

然后通过 root 这个 JsonElement 类型的对象的 GetProperty 方法来获得相应的属性,而且这个方法可以连串使用:  

最后一行使用 GetString 方法来获得该属性的字符串值。  

然后我们可以写一个递归调用的方法来遍历整个模型的每个属性:

这个方法接受 JsonElement 类型的对象,然后对该元素的属性进行循环。  

如果当前属性是另一个对象,那么就继续递归调用这个方法;

否则就输出原始的文本。

最后调用该方法:

输出结果为:

与json文件的内容匹配。

Utf8JsonWriter 类  

下面研究一下如何写入json文件。这里需要使用Utf 8JsonWriter 类。  

直接看代码:

这个类需要传递的参数类型是 Stream 或者Buffer,也就是向 Stream 或 Buffer 里面写入数据。  

那么就提供一个 buffer :  

下面单独写一个方法,来生成json数据:

参数类型是Utf 8JsonWriter 。通过智能提示可以看到它提供了很多用于写入不同类型数据的方法。  

写 JSON 对象  

现在我想写一个json对象,那么就从Write StartObject () 开始,然后以WriteEnd Object() 结束 :  

这样的话,实际上我已经拥有了一个合法的json文档。

写属性和值  

可以分开写属性和值:

也可以同时把属性和值写出来:

显示 JSON 数据  

我先写这些内容,然后在Main方法里面调用一下:

首先需要告诉writer把它的内容flush给buffer,使用这个buffer我们可以获得 writer 的输出,这样的话就会得到一个byte数组,然后把这个 byte 数组转化为字符串,这样就可以在控制台显示它了:  

运行一下看看效果:

没啥太大的问题,就是格式不好看。

对输出进行格式化  

.NET Core 提供了一个 JsonWrite r Options 类,它可以对Writer进行一些设置。  

这里对输出进行了缩进,最后把这个options传递给Utf 8JsonWriter 的构造函数即可。  

再次运行:

现在好看多了。

JsonSerializer  

前面几节的内容可能稍微有点底层,我们大部分时候可能只需要对 C# 的类进行串行化或者将 JSON 数据反串行化成 C# 类,在 .NET Core  3.0 里面,我们可以使用 JsonSerializer 这个类来做这些事情。  

例子:

还是使用之前用到的 json 数据:  

然后我们需要建建立两个类,对应这个文件:

反串行化  

可以使用Json Serializer 类的 Deserialize() 方法对 json 数据反串行化。这个方法支持三种类型的输入参数,分别是:   JSON数据的字符串 Utf 8JsonReader   Read OnlySpan<byte> ,它里面包含 JSON 数据  

为了简单一点,我直接把json文件读取成字符串,然后传给 Deserialize 方法:  

然后我试图打印出反串行化之后的一些属性数据。但是这不会成功。因为JSON文件里面数据的大小写命名规范使用的是 camel casing (简单理解为首字母是小写的),而默认情况下 Deserializer 会寻找 Pascal casing 这种规范(简单理解为每个单词的首字母都是大写的)的属性名。  

格式化  

为解决这个问题,就需要使用 JsonSerializerOptions 类:  

建立该类的一个实例,设置 Property NamingPolicy 为 CamelCase ,然后把这个实例传递给 Deserialize 方法的第二个参数。  

运行看结果 :  

这次就没有问题了。

串行化  

Json Serializer 也支持串行化,也就是把C#数据转化为 JSON 数据:  

这里使用了相同的 options 。  

运行结果:

如果想让输出结果更好看一些,可以在 JsonSerializerOptions 里面进行相应的设置:  

这次输出结果为:

总结  

总结一下 .NET Core 3.0 新的JSON  API :   Utf 8JsonReader -  读操作,快速,低级   Utf 8JsonWriter -  写操作,快速,低级   JsonDocument -  基于DOM,快速   Json Seriliazer -  串行化 / 反串行化,快速  

另外 JSON .NET  仍然被支持。  

到此这篇关于详解.NET Core 3.0 里新的JSON API的文章就介绍到这了,更多相关.NET Core 3.0 JSON 内容请搜索真格学网以前的文章或继续浏览下面的相关文章希望大家以后多多支持真格学网!

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

C:\Windows\Microfsoft.Net\Framework\v.0.50727\msccorwks.dll没有被指定在Windows上运行

卸载,在重新安装NetFramework

coremail企业邮箱收发邮件的POP和SMTP如何设置

方法:系统开110、25端口,主机的A记录地址就是POP和SMTP的地址了。

POP3服务器:pop.corpease.net      

SMTP服务器:smtp.corpease.net


  • 本文相关:
  • .net core读取json配置文件的实现示例
  • 浅析.net core中json配置的自动更新
  • .net core如何在网络高并发下提高json的处理效率详解
  • .net core简单读取json配置文件
  • .netcore获取json和xml格式的配置信息
  • asp.netcore1.1版本去掉project.json后如何打包生成跨平台包
  • asp.net core project.json文件(5)
  • asp.net core web中使用appsettings.json配置文件的方法
  • 详解asp.net core 在 json 文件中配置依赖注入
  • asp.net基础学习之控件的使用方法
  • .net中接口与类的区别浅析
  • asp.net(c#) 生成html的几种解决方案[思路]
  • asp.net实现页面传值的几种方法小结
  • asp.net 清除模式窗口数据缓存的操作方式
  • asp.net 计划任务管理程序实现,多线程任务加载
  • asp.net 使用response.filter 过滤非法词汇
  • global.asax的application_beginrequest实现url重写无后缀的代码
  • asp.net设置404页面返回302http状态码的解决方法
  • asp.net mvc 2右键菜单和简单分页实例讲解
  • C:\Windows\Microfsoft.Net\Framework\v.0.50727\m...
  • coremail企业邮箱收发邮件的POP和SMTP如何设置
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全基础应用实用技巧自学过程首页asp.net实用技巧.net core读取json配置文件的实现示例浅析.net core中json配置的自动更新.net core如何在网络高并发下提高json的处理效率详解.net core简单读取json配置文件.netcore获取json和xml格式的配置信息asp.netcore1.1版本去掉project.json后如何打包生成跨平台包asp.net core project.json文件(5)asp.net core web中使用appsettings.json配置文件的方法详解asp.net core 在 json 文件中配置依赖注入asp.net基础学习之控件的使用方法.net中接口与类的区别浅析asp.net(c#) 生成html的几种解决方案[思路]asp.net实现页面传值的几种方法小结asp.net 清除模式窗口数据缓存的操作方式asp.net 计划任务管理程序实现,多线程任务加载asp.net 使用response.filter 过滤非法词汇global.asax的application_beginrequest实现url重写无后缀的代码asp.net设置404页面返回302http状态码的解决方法asp.net mvc 2右键菜单和简单分页实例讲解java正则表达式 pattern和matche未将对象引用设置到对象的实例 (asp.net(c#)网页跳转七种方法小结未能加载文件或程序集“xxx”或它asp.net“服务器应用程序不可用”asp.net中的几种弹出框提示基本实asp.net gridview 72般绝技asp.net生成excel并导出下载五种asp.net汉字转拼音和获取汉字首字asp.net对路径"xxxxx"asp.net page.enableeventvalidation 属性asp.net实现从服务器下载文件问题处理.net读写xml文档详解asp.net中validation验证控件正则表达式特javascript c#真正可以交互的des加解密代在repeater控件中通过eval的方式绑定styl在应用程序级别之外使用注册为allowdefinasp.net 路径问题 详细说明c# 无限级分类的实现visual studio 2017设置版权的方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved