C# WebApi序列化深度和循环引用

C# WebApi序列化深度和循环引用,c#,asp.net-web-api,json.net,C#,Asp.net Web Api,Json.net,我在WebApi Restful服务上返回了几个组合对象(为了简单起见): 也就是说它不起作用。 也不是“MaxDepth”属性 我已经搜索了很多方法,但找不到一种内置的方法来实现这一点(有许多“黑客行为”),它们实现了JsonConverter的一些变体(还有[JsonIgnore]),这有助于实现其中的一些比例。 这是一个控制响应深度的常见请求,不是吗? 微软有没有可能完全忽略了这个问题,并且没有解决这个问题的内在方法 我认为最根本的问题是,您的API试图在一次调用中执行太多操作。我可能会把

我在WebApi Restful服务上返回了几个组合对象(为了简单起见):

也就是说它不起作用。 也不是“MaxDepth”属性
我已经搜索了很多方法,但找不到一种内置的方法来实现这一点(有许多“黑客行为”),它们实现了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"
       }
    ]
}