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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET 6 中的七个 System.Text.Json 特性

發布時間:2023/12/4 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET 6 中的七个 System.Text.Json 特性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

忽略循環引用

在 .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 的序列化的動圖。


序列化支持流

在 .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]}

全文完...

總結

以上是生活随笔為你收集整理的.NET 6 中的七个 System.Text.Json 特性的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。