2013-05-02 51 views
7

比方说,我有这些entitites这些关系:这只是一个虚构的例子,而不是我目前的实体。设置JSON序列中的.NET Web API的最大深度

  • 用户
  • NewsPosts

课程有很多用户, 用户有很多课程

课程有很多NewsPosts, NewsPosts有许多课程

用户有很多NewsPosts, NewsPosts有很多用户

我首先使用实体​​框架代码和.NET Web API,它以JSON的形式发回实体。当我尝试获取课程时,它会返回JSON结果与实体的关系,这很好,但我希望设置它序列化的级别的限制,以便它不会序列化第一个以外的所有关系或二级。

GET课程/将被序列化到:

{ 
    "Users":[{ 
       "id":1, 
       "newsPosts": [{ 
           "id":1, 
           "message":"foo" 
          }] 
      }], 
    "newsPosts":[{ 
       "id":2, 
       "message":"bar" 
       }] 

    } 

什么,我想是序列只有1或可能2级,这样的结果将是:

{ 
    "Users":[{ 
       "id":1, 
       "newsPosts": [] 
      }], 
    "newsPosts":[{ 
       "id":2, 
       "message":"bar" 
       }] 

    } 

我已经加入a:

json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 

这是删除参考操作。

所以简而言之:有没有什么方法可以设置最大数量的节点来序列化?

+2

[如何序列化或反序列化JSON对象到C#中的特定深度?](http:// stackoverflow。com/questions/10453127 /如何序列化或反序列化json-object-to-a-depth-in-c) – 2013-05-02 13:40:16

+1

自定义JsonWriter和自定义ContractResolver似乎是要走的路。感谢您注意到重复。 – 2013-05-06 16:19:56

回答

0

难道这不就是你如何构建从get函数发送的数据的问题吗?

我指的是JSON序列通过序列化所有你给他的数据,它的工作,只需删除数据,或者不包括它,它不会得到序列化。

如果是更精细的调整,你正在寻找一个自定义JsonWriter是你想要的,贴由Alex Filipovici链接给出怎样做才能达到良好的细节。

-1

我建议使用类似于AutoMapper的东西将您的域类映射到自定义的DTO对象,然后将这些类用于序列化。

+0

这不是一个好的做法,不要问一个问题就推荐一些东西。例如。可能在那里json将用于通用的上下文中使用:像状态处理,缓存,日志记录... – 2016-11-13 21:13:00

-1

我对Web API并不十分熟悉,但您似乎希望制作一个使用JavaScriptSerializer的自定义MediaTypeFormatter,它具有设置递归限制的属性。

MSDN - JavaScriptSerializer.RecursionLimit Property

另一种选择是让使用JSON.NET具有相同的排序选项自定义格式。

+0

是的。尽管如此,仍然想使用JSON.NET。似乎json.NET上的功能比JavaScriptserializer更多。所以是的,好像我想去其他选择!在这里找到一个比较:http://json.codeplex.com/ – 2013-05-06 16:14:28

+0

JavaScriptSerializer.RecursionLimit不适用于它。如果达到限制,JavaScriptSerializer会抛出异常。 – 2016-11-13 21:07:46