<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 6310字,需瀏覽 13分鐘

           ·

          2022-01-15 00:15




          忽略循環(huán)引用





          在 .NET 5 中,如果存在循環(huán)依賴, 那么序列化的時候會拋出異常, 而在 .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 Children { get; set; } = new();
          }

          // 輸出:
          // {
          // "Name": ".NET 6",
          // "Parent": null,
          // "Children": [
          // {
          // "Name": "System.Text.Json",
          // "Parent": null,
          // "Children": []
          // }
          // ]
          // }




          序列化和反序列化通知




          在 .NET 6 中,System.Text.Json 公開序列化和反序列化的通知。

          有四個新接口可以根據(jù)您的需要進行實現(xiàn):

          ?IJsonOnDeserialized?IJsonOnDeserializing?IJsonOnSerialized?IJsonOnSerializing

          Product invalidProduct = new() { Name = "Name", Test = "Test" };
          JsonSerializer.Serialize(invalidProduct);
          // The InvalidOperationException is thrown

          string invalidJson = "{}";
          JsonSerializer.Deserialize<Product>(invalidJson);
          // The InvalidOperationException is thrown

          class 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 deserialization
          void IJsonOnSerializing.OnSerializing() => Validate(); // Call before serialization

          private 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 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); // Text

          int 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]}

          全文完...


          瀏覽 78
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  先锋成人AV电影 | 福利在线 | 操B视频手机在线观看免费 | 在线观看日韩三级片 | 亚洲三级理论 |