.NET10:解决json序列化时引用自己

B站影视 韩国电影 2025-03-11 09:40 1

摘要:现在有一个业务场景,有一个雇员类,里面有一个管理者的属性,也是雇员类这种类型,普通雇员的管理者是经理,经理的管理者是CEO,CEO的管理要么是空,要么是自己管理自己,空是正常的,但如果CEO的管理者是自己,用.NET9实现,如下:

现在有一个业务场景,有一个雇员类,里面有一个管理者的属性,也是雇员类这种类型,普通雇员的管理者是经理,经理的管理者是CEO,CEO的管理要么是空,要么是自己管理自己,空是正常的,但如果CEO的管理者是自己,用.NET9实现,如下:

using System.Text.JSON;var ceo = new Employee { NO = 1, Name = "CEO" };ceo.Manager = ceo; // 这里报错Console.WriteLine(JsonSerializer.Serialize(ceo));Console.WriteLine("");var manager = new Employee { NO = 2, Name = "Manager" };manager.Manager = ceo;Console.WriteLine(JsonSerializer.Serialize(manager));Console.WriteLine("");var employee = new Employee { NO = 3, Name = "Employee" };employee.Manager = manager;Console.WriteLine(JsonSerializer.Serialize(employee));class Employee{ public int NO { get; set; } public string? Name { get; set; } public Employee? Manager { get; set; }}

运行,报错结果如下,出现了循环引用的异常:

当使用源生成器进行 JSON 序列化时,生成的上下文在序列化或反序列化循环引用时会抛出异常。现在,可以通过在JsonSourceGenerationOptionsAttribute中指定ReferenceHandler来自定义此行为。以下是使用JsonKnownReferenceHandler.Preserveusing System.Text.Json;using System.Text.Json.Serialization;var ceo = new Employee { NO = 1, Name = "CEO" };ceo.Manager = ceo;Console.WriteLine(JsonSerializer.Serialize(ceo, ContextWithPreserveReference.Default.Employee));Console.WriteLine("");var manager = new Employee { NO = 2, Name = "Manager" };manager.Manager = ceo; Console.WriteLine(JsonSerializer.Serialize(manager, ContextWithPreserveReference.Default.Employee));Console.WriteLine("");var employee = new Employee { NO = 3, Name = "Employee" };employee.Manager = manager;Console.WriteLine(JsonSerializer.Serialize(employee, ContextWithPreserveReference.Default.Employee));Console.ReadLine;[JsonSourceGenerationOptions(ReferenceHandler = JsonKnownReferenceHandler.Preserve)][JsonSerializable(typeof(Employee))]internal partial class ContextWithPreserveReference : JsonSerializerContext{}class Employee{ public int NO { get; set; } public string? Name { get; set; } public Employee? Manager { get; set; }}

来源:opendotnet

相关推荐