JSON 在 Web 中序列化时嵌套太深 API

JSON nesting too deep when serializing in Web API

我正在尝试使用 Web API 以 JSON 格式序列化一些对象。但是,JSON 序列化程序不遵守 Global.asax 中的设置,并且使对象嵌套过深。我将 Web API 与 Entity Framework Code First 结合使用。

这是Global.asax中与JSON相关的代码:

var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;

jsonFormatter.SerializerSettings.ReferenceLoopHandling
            = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

jsonFormatter.SerializerSettings.PreserveReferencesHandling
            = Newtonsoft.Json.PreserveReferencesHandling.None;

我正在尝试获取模块对象列表,结果如下: http://i.imgur.com/NW2JssL.png

红框内的内容是我不想连载的内容

编辑:是否也可以排除特定属性并保留其他属性?

提前致谢

您没有提供完整的模型架构,但在这种情况下您似乎不需要这些设置。

我建议您阅读此 question 的公认答案,其中很好地解释了 ReferenceLoopHandlingPreserveReferencesHandling 设置的工作原理。一般来说,这都是关于当您在要序列化的对象树中多次拥有 相同对象实例 时。看你的图不是这样的。

您似乎正在序列化您的 EF 模型,并且正在对连接的对象使用延迟加载。您可能会考虑为 JSON 序列化创建单独的模型并仅填充您需要的字段。使用此技术,您将确定从数据库中检索到哪些数据。

另一种选择是使用 JsonIgnore 属性。您可以在 EF 模型中标记所需的属性。例如:

public class A
{
    public string NameOfA { get; set; }

    [JsonIgnore]
    public string IgnoredProperty { get; set; }

    [JsonIgnore]
    public B B { get; set; }
}

public class B
{
    public string NameOfB { get; set; }
}

如果我们执行这段代码:

var a = new A
{
    NameOfA = "A",
    IgnoredProperty = "Will be ignored",
    B = new B
    {
        NameOfB = "B"
    }
};
var json = JsonConvert.SerializeObject(a, Formatting.Indented);

结果 JSON 将是:

{
  "NameOfA": "A"
}