2013-05-02 18 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