Dot-Net
在 .NET Web API 中設置 JSON 序列化的最大深度
假設我有這些具有這些關係的實體:這只是一個虛構的例子,而不是我目前的實體。
- 課程
- 使用者
- 新聞文章
課程有很多使用者,使用者有很多課程
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;這是為了刪除參考循環。
簡而言之:有沒有辦法設置最大數量的節點進行序列化?
在我看來,您有兩種選擇:
- 編寫自定義序列化程序,或使用現有庫(如果可以找到)
- 在嘗試序列化任何內容之前,準備好您希望端點發回的數據。
涉及 API 的最佳實踐之一是只發回所需的數據,因為這會影響發回的數據的大小。
實體框架通過提供太多的方式以某種方式工作,而您想限制它。解決此問題的常用方法是不讓 API 返回實體框架實體。原因有很多,可以單獨研究。
因此,一種方法是開始使用 DTO 返回數據。這有很多優點:
- 您可以控制發回的數據,並且不需要任何自定義序列化程序或另一個庫。
- 您可以控制響應的內容,這意味著有時您不需要將類中的所有公共屬性都發回,您需要一個子集並且您可以控制它。
- API 不再與實體框架及其實體緊密耦合。
缺點:
- 您現在有另一組類要處理,但是這種複雜性可以通過 AutoMapper 之類的東西輕鬆管理。