联想网站建设摘要,seo还能赚钱吗,哪个网站教做饭做的好,高端品牌网站建设建议我们给DNC3#xff08;.NET Core 3#xff09;上了一个新包#xff0c;叫做System.Text.Json(点我下载)#xff0c;支持读写器#xff0c;DOM#xff08;文档对象模型#xff09;#xff0c;和序列化#xff0c;在这篇博文里#xff0c;我会告诉大家为什么要做这个.NET Core 3上了一个新包叫做System.Text.Json(点我下载)支持读写器DOM文档对象模型和序列化在这篇博文里我会告诉大家为什么要做这个这个包怎样工作你们可以怎么去用它。也可以看视频https://sec.ch9.ms/ch9/f427/704ea54a-dsec.ch9.ms获取新Json库面向DNC开发安装DNC3的最新预览版可获得新json库还有ASP.DNC的集成。面向.NET Standard或DNF开发安装这个包(确定nuget允许预览版版本需要4.6.0-preview6.19303.8或更高)没有ASP.DNC的集成。JSON在DNC3中的前景Json已经成为了所有现代.NET应用的重要部分在许多情况下超过了XML的使用数量但是.NET还没有一个很好的内建JSON处理方案在此之前我们一直依靠Json.NET来为.NET生态服务。现在我们决定建立一个新的Json库高性能的JSON API。我们需要一批新的Json api用SpanT达成高性能直接处理UTF-8编码而不用转码成UTF-16的字串。两方面对ASP.DNC都很重要因为吞吐量非常关键。我们考虑过把代码提交给Json.NET但是既要达成我们所要的性能又不破坏Json.NET的客户使用体验几乎是不可能的。用了System.Text.Json视方案不同可以得到1.3-5倍的性能加速下面有更多细节相信还能压榨出更多性能。从ASP.DNC中移除Json.NET的依赖。 现在ASP.DNC依赖Json.NET这样ASP.DNC和Json.NET的耦合不仅高还使得Json.NET的版本被平台所限制。但是Json.NET经常更新应用开发者经常想要——或者必须使用特定的版本因此我们打算从ASP.DNC3移除Json.NET的依赖这样客户便可以选择适用版本不需要担心意外崩掉后台。为Json.NET提供了一个ASP.DNC的集成包。Json.NET基本变成了.NET处理json的瑞士军刀。这玩意提供了很多选项和工具允许客户便利地处理json需求我们不想让客户体验打折原文compromise直译折中举个蛎子调用AddJsonOptions扩展方法即可在ASP.DNC中配置Json序列化。因此我们准备对ASP.DNC提供一个Json.NET集成包开发者可以选择安装这样他们就可以在新版本中继续使用Json.NET的好处。我们还需要确保有合适的扩展点这样其他组织也可以为他们的Json库提供类似的集成包。要查看更多细节和这一举措跟Json.NET的关系可以查看我们在去年10月做的讨论。直接使用System.Text.Json所有的示例都导入了这两个包using System.Text.Json;
using System.Text.Json.Serialization;使用序列化System.Text.Json序列化器可以异步读写Json为UTF-8编码优化过使其完美地适应REST API和后台应用。class WeatherForecast
{public DateTimeOffset Date { get; set; }public int TemperatureC { get; set; }public string Summary { get; set; }
}string Serialize(WeatherForecast value)
{return JsonSerializer.ToStringWeatherForecast(value);
}
默认情况下我们提供缩小的Json如果你想提供些人类可读的东西可以向序列化器传入一个JsonSerializerOptions实例还能配置其他设置例如处理评论尾随逗号和命名策略。string SerializePrettyPrint(WeatherForecast value)
{var options new JsonSerializerOptions{WriteIndented true};return JsonSerializer.ToStringWeatherForecast(value, options);
}
反序列化与此类似// {
// Date: 2013-01-20T00:00:00Z,
// TemperatureC: 42,
// Summary: Typical summer in Seattle. Not.,
// }
WeatherForecast Deserialize(string json)
{var options new JsonSerializerOptions{AllowTrailingCommas true};return JsonSerializer.ParseWeatherForecast(json, options);
}还支持异步序列化和反序列化async Task SerializeAsync(WeatherForecast value, Stream stream)
{await JsonSerializer.WriteAsyncWeatherForecast(value, stream);
}你也可以用自定义特性虽然我更喜欢叫注解来控制序列化行为例如忽视Json中的属性并指定属性名class WeatherForecast
{public DateTimeOffset Date { get; set; }// Always in Celsius.[JsonPropertyName(temp)]public int TemperatureC { get; set; }public string Summary { get; set; }// Dont serialize this property.[JsonIgnore]public bool IsHot TemperatureC 30;
}目下还不支持F#的特殊行为例如discriminated unions可区分联合和record types记录类型以后会加。使用DOM有时候你不想反序列化json负载但是还想将其内容结构化比方说我们有个温度集合打算平均一下星期一的温度[{date: 2013-01-07T00:00:00Z,temp: 23,},{date: 2013-01-08T00:00:00Z,temp: 28,},{date: 2013-01-14T00:00:00Z,temp: 8,},
]JsonDocument类允许你便捷地访问每个属性和对应值。double ComputeAverageTemperatures(string json)
{var options new JsonReaderOptions{AllowTrailingCommas true //允许尾随逗号};using (JsonDocument document JsonDocument.Parse(json, options)){int sumOfAllTemperatures 0;int count 0;foreach (JsonElement element in document.RootElement.EnumerateArray()){DateTimeOffset date element.GetProperty(date).GetDateTimeOffset();if (date.DayOfWeek DayOfWeek.Monday){int temp element.GetProperty(temp).GetInt32();sumOfAllTemperatures temp;count;}}var averageTemp (double)sumOfAllTemperatures / count;return averageTemp;}
}使用写入器直接可以使用var options new JsonWriterOptions
{Indented true
};using (var stream new MemoryStream())
{using (var writer new Utf8JsonWriter(stream, options)){writer.WriteStartObject();writer.WriteString(date, DateTimeOffset.UtcNow);writer.WriteNumber(temp, 42);writer.WriteEndObject();}string json Encoding.UTF8.GetString(stream.ToArray());Console.WriteLine(json);
}读取器需要切换下令牌类型:byte[] data Encoding.UTF8.GetBytes(json);
Utf8JsonReader reader new Utf8JsonReader(data, isFinalBlock: true, state: default);while (reader.Read())
{Console.Write(reader.TokenType);switch (reader.TokenType){case JsonTokenType.PropertyName:case JsonTokenType.String:{string text reader.GetString();Console.Write( );Console.Write(text);break;}case JsonTokenType.Number:{int value reader.GetInt32();Console.Write( );Console.Write(value);break;}// Other token types elided for brevity}Console.WriteLine();
}和ASP.DNC的集成接受或返回对象负载时ASP.DNC中的大部分Json使用都靠自动序列化换句话说你的绝大多数应用代码不知道ASP.DNC用的是哪个Json库这样切换很容易。在这可以看到在MVC和SignalR中如何启用新Json库。和ASP.DNC MVC的集成在pre5版本中ASP.DNC MVC添加了System.Text.Json读写json的支持从pre6开始新的json库将成为序列化和反序列化json的默认选项。用MvcOptions就可以使用序列化器:services.AddControllers().AddJsonOptions(options options.JsonSerializerOptions.WriteIndented true);如果你想换回去用Newtonsoft.json需要1.从nuget上安装它2.在ConfigureServices() 添加 AddNewtonsoftJson() 调用 public void ConfigureServices(IServiceCollection services){...services.AddControllers().AddNewtonsoftJson()...}已知问题System.Text.Json对OpenAPI / Swagger的支持还在开展不太可能作为DNC3正式版的一部分发布。和SignalR的集成从DNC3Pre5开始System.Text.Json是SignalR客户端和服务器的默认核心协议了。如果你想换回Newtonsoft.Json那么客户端和服务端都可以这么做安装Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson包.在客户端向HubConnectionBuilder添加AddNewtonsoftJsonProtocol()调用new HubConnectionBuilder().WithUrl(/chatHub).AddNewtonsoftJsonProtocol()
.Build();3.在服务端让AddSignalR()调用AddNewtonsoftJsonProtocol()services.AddSignalR().AddNewtonsoftJsonProtocol();性能既然性能推动我们改良特性那么我们就需要说说新API带来的高性能。记住这些测试是基于预览版的正式版的数据很可能大不相同我们仍然在修改会影响性能的默认行为比如大小写敏感注意这些都是微测试你实际能得到的好处可能会大不一样因此如果你很在意性能确保你自己的检测能代表你的负载如果你遇到希望我们进一步优化的方案请提交bug。对System.Text.Json和Json.NET进行微测试生成如下结果场景 速度 内存消耗
反序列化 2倍 持平或更低
序列化 1.5倍 持平或更低
文档 (只读) 3-5倍 文件1MB时几乎无分配
读取器 2-3倍 几乎无分配 (在你测试之前)
写入器 1.3-1.6倍 几乎无分配对ASP.DNC MVC的System.Text.Json进行测试我们写了个生成数据的ASP.DNC应用从MVC控制器序列化和反序列化然后康康负载大小和测量结果RPS越高越好对于最普遍的负载大小MVC的System.Text.Json在输入和输出时以更小的内存占用达到了20%的吞吐量增加。总结DNC3正式版会带上System.Text.Json API属于DNC内建的Json支持包括读写器只读DOM序列化和反序列化。一开始的目标是性能一般可以有超过Json.NET2倍的性能但是这取决于你的方案和负载因此需要确保你的重点。ASP.DNC3添加了System.Text.Json的支持, 默认启用。试试System.Text.Json并向我们反馈!{happy: coding!}