.NET?6中System.Text.Json的七個(gè)特性
忽略循環(huán)引用
在 .NET 5 中,如果存在循環(huán)依賴, 那么序列化的時(shí)候會(huì)拋出異常, 而在 .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 公開(kāi)序列化和反序列化的通知。
有四個(gè)新接口可以根據(jù)您的需要進(jìn)行實(shí)現(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 編寫(xiě) JSON
.NET 6 增加了 System.Text.Json.Utf8JsonWriter,你可以方便的用它編寫(xiě)原始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
// 4IAsyncEnumerable 的序列化的動(dòng)圖。

序列化支持流
在 .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 一樣訪問(wèn) 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]}以上所述是小編給大家介紹的.NET 6中System.Text.Json的七個(gè)特性,希望對(duì)大家有所幫助。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
ASP.NET中CheckBoxList復(fù)選框列表控件詳細(xì)使用方法
本文主要介紹CheckBoxList幾種常見(jiàn)的用法,并做出范例演示供大家參考,希望對(duì)學(xué)習(xí)asp.net的朋友有所幫助。2016-04-04
ASP.NET系統(tǒng)關(guān)鍵字及保留字列表整理
ASP.NET系統(tǒng)關(guān)鍵字及保留字列表,大家在寫(xiě)程序的時(shí)候一定要避免使用,免得引起不需要的麻煩2012-10-10
.Net行為型設(shè)計(jì)模式之觀察者模式(Observer)
這篇文章介紹了.Net行為型設(shè)計(jì)模式之觀察者模式(Observer),文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
ASP.Net?Core?MVC基礎(chǔ)系列之項(xiàng)目創(chuàng)建
這篇文章介紹了創(chuàng)建ASP.Net?Core?MVC項(xiàng)目的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02
.Net中的不可變集合(Immutable Collection)程序集簡(jiǎn)介
這篇文章介紹了.Net中的不可變集合(Immutable Collection)程序集,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

