1. 程式人生 > 程式設計 >.NET 6中System.Text.Json的七個特性

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

目錄
  • 忽略迴圈引用
  • 序列化和反序列化通知
  • 序列化支援屬性排序
  • 使用 Utf8onWriter 編寫 JSON
  • IAsyncEnumerable 支援
  • 序列化支援流
  • 像 DOM 一樣使用 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> Child
ren { 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 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 fynfWiqA
'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 ProfynfWiqAduct : 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 IAhttp://www.cppcns.comsyncEnumerable<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 的序列化的動圖。

.NET6中System.Text.Json的七個特性

序列化支援流

在 .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
                              //www.cppcns.com 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,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,2]}

以上所述是小編給大家介紹的.NET 6中System.Text.Json的七個特性,希望對大家有所幫助。在此也非常感謝大家對我們的支援!