日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[译]试用新的System.Text.Json API

發(fā)布時(shí)間:2023/12/4 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [译]试用新的System.Text.Json API 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

譯注

嘗試新的System.Text.Json API

對(duì)于.NET Core 3.0,我們 提供了一個(gè)名為System.Text.Json的全新命名空間 ,支持讀取器/寫(xiě)入器,文檔對(duì)象模型(DOM)和序列化。在這篇博文中,我告訴你為什么我們建造它,它是如何工作的,以及你如何試用它。

我們還有一個(gè)視頻:

https://sec.ch9.ms/ch9/f427/704ea54a-dac0-4ef8-b1bc-e9fde129f427/onNET_high.mp4

獲取新的JSON庫(kù)

  • 如果您的目標(biāo)是.NET Core。安裝最新版本的.NET Core 3.0預(yù)覽版。這為您提供了新的JSON庫(kù)和ASP.NET Core集成。

  • 如果您的目標(biāo)是.NET Standard或.NET Framework。安裝System.Text.JsonNuGet包(確保包含預(yù)覽并安裝版本4.6.0-preview6.19303.8或更高版本)。為了與ASP.NET Core集成,您必須以.NET Core 3.0為目標(biāo)。

.NET Core 3.0中JSON的未來(lái)

JSON已經(jīng)成為幾乎所有現(xiàn)代.NET應(yīng)用程序的重要組成部分,并且在許多情況下甚至超過(guò)了XML的使用范圍。但是,.NET還沒(méi)有(強(qiáng)大的)內(nèi)置方式來(lái)處理JSON。相反,我們一直依賴(lài)Json.NET,它繼續(xù)為.NET生態(tài)系統(tǒng)提供良好的服務(wù)。

我們已經(jīng)決定構(gòu)建一個(gè)新的JSON庫(kù):

  • 提供高性能的JSON API。我們需要一組新的JSON API,這些API通過(guò)使用Span<T>?可以高度優(yōu)化性能, 并且可以直接處理UTF-8而無(wú)需轉(zhuǎn)碼為UTF-16?string?實(shí)例。這兩個(gè)方面對(duì)于ASP.NET Core至關(guān)重要,因?yàn)橥掏铝渴顷P(guān)鍵要求。我們考慮過(guò)對(duì)Json.NET做出貢獻(xiàn),但如果不破壞現(xiàn)有的Json.NET客戶(hù)或者破壞我們可以實(shí)現(xiàn)的性能,這被認(rèn)為是不可能的。有了這些?System.Text.Json,我們可以獲得1.3倍速--5倍的速度,具體取決于場(chǎng)景(更多細(xì)節(jié)見(jiàn)下文)。我們相信我們?nèi)匀豢梢詳D出更多。

  • 從ASP.NET Core中刪除Json.NET依賴(lài)項(xiàng)。今天,ASP.NET Core依賴(lài)于Json.NET。雖然這提供了ASP.NET Core和Json.NET之間的緊密集成,但它也意味著Json.NET的版本由底層平臺(tái)決定。但是,Json.NET經(jīng)常更新,應(yīng)用程序開(kāi)發(fā)人員通常希望 - 甚至必須 - 使用特定版本。因此,我們希望從ASP.NET Core 3.0中刪除Json.NET依賴(lài)項(xiàng),以便客戶(hù)可以選擇使用哪個(gè)版本,而不必?fù)?dān)心它們可能會(huì)意外破壞底層平臺(tái)。

  • 為Json.NET提供ASP.NET Core集成包。Json.NET基本上已成為.NET中JSON處理的瑞士軍刀。它提供了許多選項(xiàng)和工具,使客戶(hù)可以輕松地處理其JSON需求。我們不想在客戶(hù)今天獲得的Json.NET支持上妥協(xié)。例如,能夠通過(guò)AddJsonOptions?擴(kuò)展方法在ASP.NET Core中配置JSON序列化 。因此,我們希望為ASP.NET Core提供Json.NET集成作為開(kāi)發(fā)人員可以選擇安裝的NuGet包,這樣他們就可以獲得今天從Json.NET獲得的所有功能。此工作項(xiàng)的另一部分是確保我們擁有正確的擴(kuò)展點(diǎn),以便其他方可以為其選擇的JSON庫(kù)提供類(lèi)似的集成包。

有關(guān)動(dòng)機(jī)及其與Json.NET的關(guān)系的更多詳細(xì)信息,請(qǐng)查看 我們?cè)?0月份發(fā)布的公告。

直接使用System.Text.Json

對(duì)于所有示例,請(qǐng)確保導(dǎo)入以下兩個(gè)名稱(chēng)空間:

using System.Text.Json;
using System.Text.Json.Serialization;

使用序列化器

該?System.Text.Json?序列化器可以異步讀寫(xiě)JSON并且對(duì)UTF-8文本進(jìn)行了優(yōu)化,使其成為理想的REST API和后端應(yīng)用程序。

class WeatherForecast
{
public DateTimeOffset Date { get; set; }
public int TemperatureC { get; set; }
public string Summary { get; set; }
}

string Serialize(WeatherForecast value)
{
return JsonSerializer.ToString<WeatherForecast>(value);
}

默認(rèn)情況下,我們生成縮小的JSON。如果要生成易讀的內(nèi)容,可以將?JsonSerializerOptions?的實(shí)例傳遞給序列化程序。這也是您配置其他設(shè)置的方式,例如處理注釋,尾隨逗號(hào)和命名策略。

string SerializePrettyPrint(WeatherForecast value)
{
var options = new JsonSerializerOptions
{
WriteIndented = true
};

return JsonSerializer.ToString<WeatherForecast>(value, options);
}

反序列化的工作方式類(lèi)似:

// {
// "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.Parse<WeatherForecast>(json, options);
}

我們還支持異步序列化和反序列化:

async Task SerializeAsync(WeatherForecast value, Stream stream)
{
await JsonSerializer.WriteAsync<WeatherForecast>(value, stream);
}

您還可以使用自定義屬性來(lái)控制序列化行為,例如,忽略屬性并在JSON中指定屬性的名稱(chēng):

class WeatherForecast
{
public DateTimeOffset Date { get; set; }

// 總是使用攝氏度
[JsonPropertyName("temp")]
public int TemperatureC { get; set; }

public string Summary { get; set; }

// 不序列化這個(gè)屬性
[JsonIgnore]
public bool IsHot => TemperatureC >= 30;
}

我們目前不支持F#特定行為(例如有區(qū)別的聯(lián)合和記錄類(lèi)型),但我們?計(jì)劃將來(lái)添加它。

使用DOM

有時(shí)您不希望反序列化JSON有效負(fù)載,但您仍希望對(duì)其內(nèi)容進(jìn)行結(jié)構(gòu)化訪問(wèn)。例如,假設(shè)我們有一組溫度,并希望計(jì)算出星期一的平均溫度:

[
{
"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?類(lèi)可以很容易地訪問(wèn)各個(gè)屬性和值。

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;
}
}

使用寫(xiě)入器(Writer)

寫(xiě)入器很容易使用:

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);
}

讀取器需要在不同的token類(lèi)型間切換處理:

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.NET Core集成

在接受或返回對(duì)象有效負(fù)載時(shí),通過(guò)自動(dòng)序列化提供ASP.NET內(nèi)核中大多數(shù)JSON的使用,這反過(guò)來(lái)意味著大多數(shù)應(yīng)用程序的代碼與ASP.NET Core正在使用的JSON庫(kù)無(wú)關(guān)。這使得從一個(gè)切換到另一個(gè)變得容易。

您可以在本文后面看到有關(guān)如何在MVC和SignalR中啟用新JSON庫(kù)的詳細(xì)信息。

與ASP.NET Core MVC集成

在預(yù)覽版5中,ASP.NET Core MVC增加了對(duì)使用JSON讀寫(xiě)的支持 System.Text.Json。從Preview 6開(kāi)始,默認(rèn)情況下使用新的JSON庫(kù)來(lái)序列化和反序列化JSON有效負(fù)載。

可以使用MvcOptions配置序列化程序的選項(xiàng) :

services.AddControllers()
.AddJsonOptions(options => options.JsonSerializerOptions.WriteIndented = true);

如果您想切換回之前的默認(rèn)使用方式Newtonsoft.Json,請(qǐng)執(zhí)行以下操作:

  • 安裝?Microsoft.AspNetCore.Mvc.NewtonsoftJson?NuGet包。

  • 在?ConfigureServices()?中加入AddNewtonsoftJson()的調(diào)用

    public void ConfigureServices(IServiceCollection services)
    {
    ...
    services.AddControllers()
    + .AddNewtonsoftJson()
    ...
    }
  • 已知的問(wèn)題

    • System.Text.Json?對(duì)OpenAPI / Swagger的支持正在進(jìn)行,并且不太可能作為3.0版本的一部分提供。

    與SignalR集成

    System.Text.Json?現(xiàn)在是SignalR客戶(hù)端和服務(wù)器在ASP.NET Core 3.0 Preview 5中使用的默認(rèn)集線協(xié)議(Hub Protocol)。

    如果您想切換回以前的默認(rèn)使用Newtonsoft.Json,那么您可以在客戶(hù)端和服務(wù)器上執(zhí)行此操作。

  • 安裝?Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson?NuGet包。

  • 在客戶(hù)端?HubConnectionBuilder?中添加?.AddNewtonsoftJsonProtocol()?:

    new HubConnectionBuilder()
    .WithUrl("/chatHub")
    .AddNewtonsoftJsonProtocol()
    .Build();
  • 在服務(wù)器AddSignalR()調(diào)用中添加?.AddNewtonsoftJsonProtocol():

    services.AddSignalR()
    .AddNewtonsoftJsonProtocol();
  • 性能

    由于此功能受性能的強(qiáng)烈推動(dòng),我們希望分享新API的一些高級(jí)性能特征。

    請(qǐng)記住,這些都是基于預(yù)覽版本,最終數(shù)字很可能會(huì)有所不同。我們還在調(diào)整會(huì)影響性能的默認(rèn)行為(例如,區(qū)分大小寫(xiě))。請(qǐng)注意,這些都是微基準(zhǔn)測(cè)試。您的里程肯定會(huì)有所不同,因此如果性能對(duì)您至關(guān)重要,請(qǐng)確保針對(duì)最能代表您工作負(fù)載的方案進(jìn)行自己的測(cè)量。如果您遇到希望我們進(jìn)一步優(yōu)化的方案,請(qǐng)?zhí)峤诲e(cuò)誤。

    原生 System.Text.Json

    只需進(jìn)行微基準(zhǔn)測(cè)試即可?System.Text.Json?與Json.NET 進(jìn)行比較 ,得出以下結(jié)果:

    場(chǎng)景速度內(nèi)存
    反序列化快2倍持平或更低
    序列化快1.5倍持平或更低
    文件(只讀)快3-5倍<1 MB無(wú)分配
    讀取器快2-3倍無(wú)分配(直到實(shí)現(xiàn)值(materialize values))
    寫(xiě)入器快1.3-1.6倍無(wú)分配

    ASP.NET Core MVC 中的 System.Text.Json

    我們編寫(xiě)了一個(gè)ASP.NET Core應(yīng)用程序,可以動(dòng)態(tài)生成?數(shù)據(jù)?,然后從MVC控制器進(jìn)行序列化和反序列化 。然后我們改變有效載荷大小并測(cè)量結(jié)果:

    JSON反序列化(輸入)

    描述吞吐量(RPS)CPU (%)內(nèi)存 (MB)
    Newtonsoft.Json – 500 B136,43595172
    System.Text.Json – 500 B167,86194169
    Newtonsoft.Json – 2.4 KB97,13797174
    System.Text.Json – 2.4 KB32,02696169
    Newtonsoft.Json – 40 KB7,71288212
    System.Text.Json – 40 KB16,62596193

    JSON序列化(輸出)

    描述吞吐量(RPS)CPU(%)內(nèi)存(MB)
    Newtonsoft.Json - 500 B120,27394174
    System.Text.Json - 500 B145,63194173
    Newtonsoft.Json - 8 KB35,40898187
    System.Text.Json - 8 KB56,42497184
    Newtonsoft.Json - 40 KB8,41699202
    System.Text.Json - 40 KB14,84898197

    對(duì)于最常見(jiàn)的有效負(fù)載大小,?System.Text.Json?在輸入和輸出格式化期間,MVC的吞吐量增加約20%,內(nèi)存占用量更小。

    摘要

    在.NET Core 3.0中,我們將發(fā)布新的?System.Text.Json?API,它們提供對(duì)JSON的內(nèi)置支持,包括讀取器/寫(xiě)入器,只讀DOM和序列化/反序列化。主要目標(biāo)是性能,我們看到的一般速度比Json.NET高出2倍,但這取決于您的場(chǎng)景和有效負(fù)載,因此請(qǐng)確保衡量對(duì)您來(lái)說(shuō)重要的因素。

    ASP.NET Core 3.0包含支持System.Text.Json,默認(rèn)情況下已啟用。

    試試?System.Text.Json?吧,然后反饋給我們!

    {"happy": "coding!"}

    原文地址:https://www.cnblogs.com/waku/p/11026630.html

    .NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總?http://www.csharpkit.com?


    總結(jié)

    以上是生活随笔為你收集整理的[译]试用新的System.Text.Json API的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。