.NET 6中System.Text.Json的七個特性
阿新 • • 發佈:2022-01-07
目錄
- 忽略迴圈引用
- 序列化和反序列化通知
- 序列化支援屬性排序
- 使用 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> 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 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 的序列化的動圖。
序列化支援流
在 .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的七個特性,希望對大家有所幫助。在此也非常感謝大家對我們的支援!