.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; }
}

  运行结果如下:

  文章来源微信公众号

  想要更快更方便的了解相关知识,可以关注微信公众号 

 

posted @ 2025-03-10 19:50  刘靖凯  阅读(27)  评论(0)    收藏  举报