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 的公认答案,其中很好地解释了 ReferenceLoopHandling
和 PreserveReferencesHandling
设置的工作原理。一般来说,这都是关于当您在要序列化的对象树中多次拥有 相同对象实例 时。看你的图不是这样的。
您似乎正在序列化您的 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"
}
我正在尝试使用 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 的公认答案,其中很好地解释了 ReferenceLoopHandling
和 PreserveReferencesHandling
设置的工作原理。一般来说,这都是关于当您在要序列化的对象树中多次拥有 相同对象实例 时。看你的图不是这样的。
您似乎正在序列化您的 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"
}