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

现在有一个业务场景,有一个雇员类,里面有一个管理者的属性,也是雇员类这种类型,普通雇员的管理者是经理,经理的管理者是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.Preserve 的示例:

using 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; }
}
运行结果如下:

图片

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/425607.html

联系我们
联系我们
分享本页
返回顶部