【问题标题】:C# Circular reference. System.Text.Json.JsonException: A possible object cycle was detected .NET 5C# 循环引用。 System.Text.Json.JsonException:检测到可能的对象循环 .NET 5
【发布时间】:2021-12-09 02:44:18
【问题描述】:

我创建了一个返回对象 A 的 API,其中包含对象 B,而对象 B 包含对象 A,请参见下面的示例:

public class Person() { 
    string Name {get;set;}
    List<Schema> Schemas {get;set;}
}
public class Schema(){
    List<Person> Persons {get;set;}
}

在 C# 中这不是问题,也不会捕获异常(我在各处都添加了 try-catch-statements。

问题:当我使用 swagger 尝试该功能时,抛出给客户端的异常是 500。

调用 API 的客户端告诉我这是一个 cors 策略验证。这我确定这不是问题,因为它在其他场景中运行良好。

【问题讨论】:

  • 在 Stack Overflow 中,您可以自己回答问题,但更合适的做法是在问题部分提出问题,然后添加您自己的答案。该问题还需要有关发生错误的上下文的更多详细信息,以使问题/答案对其他人有帮助(这就是 SO 的意义所在)
  • 您最好找到直接归因于此的最受欢迎/最佳书面(可能未回答)的问题,写下您的话作为答案,然后也可以投票关闭所有其他问题与您写出完美答案的问题相同的问题;这将对该网站做出巨大贡献,让您为您的答案投票并消除一些噪音,并帮助建立关于该主题的规范问题。可能经常出现;当人们通过 Enitity Framework(双向)创建对象图时,我看到了它
  • 感谢您的 cmets! @ChristopherHamkins - 我将问题和答案分开并添加了更多详细信息。
  • @CaiusJard - 我发现了大约 3 个与此类似的其他帖子,但它一直在使用其他框架。在 .Net 2 - 3 中,有另一个使用 Newtonsoft 的工作解决方案,所以我不想将我的解决方案与已经工作的解决方案放在一起。
  • 是的,通常它是由序列化数据库实体引起的,这并不理想。总而言之,通过切换到将 db ents 与presentation 分开的结构,问题就消失了,并且presentation 没有循环

标签: c# json .net-core configuration circular-reference


【解决方案1】:

要查看实际问题,我必须转到 Windows“事件记录器”。

从事件记录器中我发现了这个:

例外: System.Text.Json.JsonException:检测到可能的对象循环。这可能是由于循环或对象深度大于允许的最大深度 32。考虑在 JsonSerializerOptions 上使用 ReferenceHandler.Preserve 以支持循环。 在 System.Text.Json.ThrowHelper.ThrowJsonException_SerializerCycleDetected(Int32 maxDepth) 在 System.Text.Json.Serialization.JsonConverter`1.TryWrite(Utf8JsonWriter writer, T& value, JsonSerializerOptions options, WriteStack& state)

为了解决循环引用的问题,我在配置(startup.cs,API)中添加了以下代码:

   services.AddMvc()
                .AddJsonOptions(opt =>
                 {
                     opt.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.Preserve;
                 });

文档可在以下位置找到: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to?pivots=dotnet-5-0

【讨论】:

    猜你喜欢
    • 2021-08-30
    • 2020-07-06
    • 2020-10-02
    • 1970-01-01
    • 2020-03-30
    • 2020-04-27
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多