.net core 3 jsonシーケンス化ネストオブジェクトの問題
2つのクラス
CookingMenuはメインクラス、MenuItemはサブクラスです.CookingMenuにはナビゲーション属性MenuItemsが含まれ、MenuItemにはナビゲーション属性CookingMenuが含まれます.コントローラでCookingMenuコレクションのJsonオブジェクトを返す
Includeメソッドを追加しないと、コードに問題はありません.Includeを追加すると、例外が放出されます.System.Text.Json.JsonException: A possible object cycle was detected which is not supported. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32.サポートされていないオブジェクトループが検出され、ループ深さが最大許容深さ32を超える.
簡単に分析すると、これは実際にはループリファレンスの問題であり、CookingMenuクラスはMenuItemクラスを参照し、MenuItemではCookingMenuクラスを参照し、ループリファレンスを形成していることがわかります.シーケンス化するとクラッシュします.
ネットで調べてみると、Microsoftをインストールすると言いました.AspNetCore.Mvc.NewtonsoftJsonパッケージでこの問題を解決できます.そこでNuGetでMicrosoftを見つけた.AspNetCore.Mvc.NewtonsoftJson、最新版は3.14で、結局インストールタイムズ3.14はサポートしています.net core3.1以上のバージョンで、私のプロジェクトは.net core 3.0.そこでバージョンを下げる、Microsoftをインストールした.AspNetCore.Mvc.NewtonsoftJson 3.0.0ですが、問題は解決されておらず、バージョンの問題かどうか分かりません.異常なネーミングスペースはSystemですから.Text.Json、そこでこのネーミングスペースを見て、下にサブネーミングスペースSerializationがあることを発見して、このネーミングスペースの中でJsonIgnoreの特性を見て、この特性はシーケンス化してマークアップされた属性を無視することができます.
MenuItemのCookingMenu属性にJsonIgnore特性を加えると,問題が解決する.しかし、JsonIgnoreプロパティが追加されると、LinqクエリにIncludeメソッドが追加されても無視されるという問題が残っています.これにより、Includeメソッドで関連データを表示することはできません.この問題はしばらく解決策が見つからなかったので,後で話しましょう.
public class CookingMenu
{
public int Id { get; set; }
public string Name { get; set; }
public List
CookingMenuはメインクラス、MenuItemはサブクラスです.CookingMenuにはナビゲーション属性MenuItemsが含まれ、MenuItemにはナビゲーション属性CookingMenuが含まれます.コントローラでCookingMenuコレクションのJsonオブジェクトを返す
public async Task GetCustomerMenus(int customerId)
{
var menus = context.CookingMenus
.Include(m => m.MenuItems)
.Where(m => m.CustomerId == customerId);
return new JsonResult(new { success = true, menus = await menus.ToListAsync() });
}
Includeメソッドを追加しないと、コードに問題はありません.Includeを追加すると、例外が放出されます.System.Text.Json.JsonException: A possible object cycle was detected which is not supported. This can either be due to a cycle or if the object depth is larger than the maximum allowed depth of 32.サポートされていないオブジェクトループが検出され、ループ深さが最大許容深さ32を超える.
簡単に分析すると、これは実際にはループリファレンスの問題であり、CookingMenuクラスはMenuItemクラスを参照し、MenuItemではCookingMenuクラスを参照し、ループリファレンスを形成していることがわかります.シーケンス化するとクラッシュします.
ネットで調べてみると、Microsoftをインストールすると言いました.AspNetCore.Mvc.NewtonsoftJsonパッケージでこの問題を解決できます.そこでNuGetでMicrosoftを見つけた.AspNetCore.Mvc.NewtonsoftJson、最新版は3.14で、結局インストールタイムズ3.14はサポートしています.net core3.1以上のバージョンで、私のプロジェクトは.net core 3.0.そこでバージョンを下げる、Microsoftをインストールした.AspNetCore.Mvc.NewtonsoftJson 3.0.0ですが、問題は解決されておらず、バージョンの問題かどうか分かりません.異常なネーミングスペースはSystemですから.Text.Json、そこでこのネーミングスペースを見て、下にサブネーミングスペースSerializationがあることを発見して、このネーミングスペースの中でJsonIgnoreの特性を見て、この特性はシーケンス化してマークアップされた属性を無視することができます.
public class MenuItem
{
public int Id { get; set; }
public int MenuId { get; set; }
[JsonIgnore]
public virtual CookingMenu CookingMenu { get; set; }
}
MenuItemのCookingMenu属性にJsonIgnore特性を加えると,問題が解決する.しかし、JsonIgnoreプロパティが追加されると、LinqクエリにIncludeメソッドが追加されても無視されるという問題が残っています.これにより、Includeメソッドで関連データを表示することはできません.この問題はしばらく解決策が見つからなかったので,後で話しましょう.