C# WebApi序列化深度和循环引用
我在WebApi Restful服务上返回了几个组合对象(为了简单起见): 也就是说它不起作用。 也不是“MaxDepth”属性C# WebApi序列化深度和循环引用,c#,asp.net-web-api,json.net,C#,Asp.net Web Api,Json.net,我在WebApi Restful服务上返回了几个组合对象(为了简单起见): 也就是说它不起作用。 也不是“MaxDepth”属性 我已经搜索了很多方法,但找不到一种内置的方法来实现这一点(有许多“黑客行为”),它们实现了JsonConverter的一些变体(还有[JsonIgnore]),这有助于实现其中的一些比例。 这是一个控制响应深度的常见请求,不是吗? 微软有没有可能完全忽略了这个问题,并且没有解决这个问题的内在方法 我认为最根本的问题是,您的API试图在一次调用中执行太多操作。我可能会把
我已经搜索了很多方法,但找不到一种内置的方法来实现这一点(有许多“黑客行为”),它们实现了JsonConverter的一些变体(还有[JsonIgnore]),这有助于实现其中的一些比例。
这是一个控制响应深度的常见请求,不是吗?
微软有没有可能完全忽略了这个问题,并且没有解决这个问题的内在方法 我认为最根本的问题是,您的API试图在一次调用中执行太多操作。我可能会把它分成
/api/categories
,/api/categories/{id}
,/api/categories/{id}/items
,/api/items/{id
}。第一个url只返回类别信息,第二个是关于类别的详细信息,第三个是关于该类别中的项目的信息,第四个是关于项目的详细信息。您可以将API中的模型展平,这样就不会表示递归数据,而是在获取项的详细信息时包含URL以检索项所属类别的信息
例如,/api/items/foo
将返回如下内容:
{
"name" : "foo",
"value" : "bar",
"categories" [
{
"name" : "Cat A",
"parent" : {
"name" : "Top Cat A",
"location" : "/api/categories/topcata"
}
"location" : "/api/categories/cata"
},
{
"name" : "Cat B",
"parent" : null,
"location" : "/api/categories/catb"
}
]
}
这将序列化问题转化为模型映射问题,您可以对其进行更多的控制。我认为它还为您的消费者提供了一个更干净、更易于管理的API。您希望Web API如何神奇地看到您创建的
JsonSerializerSettings
实例,然后将其丢弃?当然,它可能会重复(SLaks)。。jsonFormatter.SerializerSettings=jSettings;无需说明明显的…什么是jsonFormatter
?GlobalConfiguration.Configuration.Formatters.jsonFormatter;因此,如果我有一个由菜单项组成的层次结构(例如),其中一个项也可以是一个类别,那么我应该拆分我的api调用,以便接收完整的项目层次结构?我想没有,但是谢谢。
publicHttpResponseMessage getItems()
{
List<Category> categories;
...
return Request.CreateResponse(HttpStatusCode.OK, new { results = items});
}
JsonMediaTypeFormatter jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
var jSettings = new JsonSerializerSettings()
{
Formatting = Formatting.Indented,
DateTimeZoneHandling = DateTimeZoneHandling.Utc,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
};
jsonFormatter.SerializerSettings = jSettings;
{
"name" : "foo",
"value" : "bar",
"categories" [
{
"name" : "Cat A",
"parent" : {
"name" : "Top Cat A",
"location" : "/api/categories/topcata"
}
"location" : "/api/categories/cata"
},
{
"name" : "Cat B",
"parent" : null,
"location" : "/api/categories/catb"
}
]
}