【问题标题】:JSON Self referencing loopJSON自引用循环
【发布时间】:2018-02-16 14:57:48
【问题描述】:

我正在构建一些小型预订应用程序,但我一直收到此错误。

我解决了这个问题: config.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

但现在我得到这样的答案:

{
    "ApartmentId": 1,
    "Building": {
        "BuildingId": 1,
        "Apartments": [
            {
                "ApartmentId": 2,
            }
        ]
    },
}

对于课程建设,一切正常。公寓只会“走得很远”。我尝试了该主题的解决方案,但没有成功:https://stackoverflow.com/questions/7397207/json-net-error-self-referencing-loop-detected-for-type#=

这是我的课程:

public class Apartment
{
    public int ApartmentId { get; set; }
    public Building Building { get; set; }
}

public class Building
{
    public int BuildingId { get; set; }
    public List<Apartment> Apartments { get; set; }
}

问题是,我错过了什么?如何摆脱二次挂牌?

【问题讨论】:

  • 您能否更具体地说明您的结果有什么问题。如果您可以删除额外的属性,那就更容易回答了。
  • 当我要公寓时,我想得到它所属的建筑物,而不是该建筑物中公寓的列表。
  • 您在BedroomCount 中有一个不幸的错字。 (我希望这是一个错字。我不知道你经营的是什么类型的企业。)
  • 您可能想尝试自定义 JsonConverter。不确定。 newtonsoft.com/json/help/html/CustomJsonConverter.htm

标签: c# asp.net json


【解决方案1】:

由于您使用的是 Newtosoft 的 Json 库,因此您可以使用属性 [JsonIgnore]。具有此属性的属性不会显示在您的 json 中。

您可以将其与您的 Building 类中的 Apartments 属性一起使用:

public class Building
{
    //All other properties ...

    [JsonIgnore]
    public List<Apartment> Apartments { get; set; }
}

如果你想对同一个类有不同的序列化行为,我建议为每个数据传输场景的每个类实现DTO classes approach,并根据需要添加属性。

还有来自 Microsoft 的 this document 关于 DTO 模式。

【讨论】:

  • 我试过了。但在那种情况下,当我需要它时,我不会在建筑物列表中列出该属性。
  • 如果你希望同一个类在序列化时以不同的方式表现,我认为你必须实现 DTO 类,每个类都有自己的行为设计。
  • 这是我的第一个项目,所以我试图解决每一个可能的问题,而不仅仅是逃避它。我想也许我犯了一些我没有看到的“愚蠢”错误,但因为不是这种情况,所以我尝试使用 DTO。
猜你喜欢
  • 1970-01-01
  • 2016-02-15
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 2011-01-01
  • 1970-01-01
  • 2017-10-17
相关资源
最近更新 更多