目录
忽略循环引用序列化和反序列化通知 序列化支持属性排序使用 Utf8jsonWriter 编写 JSONIAsyncEnumerable 支持序列化支持流像 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 公开序列化和反序列化的通知。
有四个新接口可以根据您的需要进行实现:
IJsonOnDeserializedIJsonOnDeserializingIJsonOnSerializedIJsonOnSerializingProduct 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 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 sthttp://www.easck.comring 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 IAsyncEnumerableJsonSerializerOptions 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 IAsyncEnumerableusing 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// 4IAsyncEnumerable 的序列化的动图。
g in JSON formatstring json = jObject.ToJsonString();Console.WriteLine(json); // {"Value":"Text","Array":[1,5,13,17,2]}
以上所述是小编给大家介绍的.NET 6中System.Text.Json的七个特性,希望对大家有所帮助。在此也非常感谢大家对我们网站的支持!








