Dot-Net

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

  • October 21, 2020

假設我有這些具有這些關係的實體:這只是一個虛構的例子,而不是我目前的實體。

  • 課程
  • 使用者
  • 新聞文章

課程有很多使用者,使用者有很多課程

Courses 有很多 NewsPosts,NewsPosts 有很多 Courses

使用者有很多 NewsPosts,NewsPosts 有很多使用者

我首先將實體框架程式碼與 .NET Web API 一起使用,它以 JSON 的形式發回實體。當我嘗試獲取課程時,它會返回一個帶有實體關係的 JSON 結果,這很好,但我希望設置它序列化的級別的限制,因此它不會序列化第一個之外的所有關係或二級。

GET Course/ 將被序列化為:

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

  }

我想要的是僅序列化 1 個或 2 個級別,因此結果將是:

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

  }

我添加了一個:

   json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;

這是為了刪除參考循環。

簡而言之:有沒有辦法設置最大數量的節點進行序列化?

在我看來,您有兩種選擇:

  1. 編寫自定義序列化程序,或使用現有庫(如果可以找到)
  2. 在嘗試序列化任何內容之前,準備好您希望端點發回的數據。

涉及 API 的最佳實踐之一是只發回所需的數據,因為這會影響發回的數據的大小。

實體框架通過提供太多的方式以某種方式工作,而您想限制它。解決此問題的常用方法是不讓 API 返回實體框架實體。原因有很多,可以單獨研究。

因此,一種方法是開始使用 DTO 返回數據。這有很多優點:

  1. 您可以控制發回的數據,並且不需要任何自定義序列化程序或另一個庫。
  2. 您可以控制響應的內容,這意味著有時您不需要將類中的所有公共屬性都發回,您需要一個子集並且您可以控制它。
  3. API 不再與實體框架及其實體緊密耦合。

缺點:

  1. 您現在有另一組類要處理,但是這種複雜性可以通過 AutoMapper 之類的東西輕鬆管理。

引用自:https://stackoverflow.com/questions/16338667