在.NET Web API中设置JSON序列化的最大深度

Are*_*aas 10 .net serialization json asp.net-web-api

假设我有这些关系的权利:这只是一个虚构的例子,而不是我现在的实体.

  • 课程
  • 用户
  • NewsPosts

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

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

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

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

GET课程/将序列化为:

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

   }
Run Code Online (Sandbox Code Playgroud)

我想要的是仅序列化1个或2个级别,结果将是:

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

   }
Run Code Online (Sandbox Code Playgroud)

我添加了一个:

    json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
Run Code Online (Sandbox Code Playgroud)

这是删除referencelooping.

简而言之:有没有办法设置最大数量的节点来序列化?

And*_*niu 1

在我看来,你有两个选择:

  1. 编写一个自定义序列化程序,或者使用现有的库(如果可以找到)
  2. 在尝试序列化任何内容之前,准备好您希望端点发回的数据。

对于 API 而言,最佳实践之一是仅发回所需的数据,因为这会影响发回的数据大小。

实体框架以某种方式工作,提供了太多的东西,而你想限制它。解决此问题的常见方法是不让 API 返回实体框架实体。造成这种情况的原因有很多,可以单独研究。

因此,一种方法是开始使用 DTO 返回数据。这有很多优点:

  1. 您可以控制发回的数据,并且不需要任何自定义序列化程序或另一个库。
  2. 您可以控制响应的内容,这意味着有时您不需要发回类中的所有公共属性,您需要一个子集并且可以控制它。
  3. API 不再与实体框架及其实体紧密耦合。

缺点:

  1. 现在您需要处理另一组类,但是可以使用 AutoMapper 之类的工具轻松管理这种复杂性。