EF Core ではナビゲーション プロパティが自動的に修正されるため、オブジェクト グラフでサイクルが発生する可能性があります。 たとえば、ブログとその関連する投稿を読み込むと、投稿のコレクションを参照するブログ オブジェクトが作成されます。 これらの各投稿には、ブログへの参照が含まれます。
一部のシリアル化フレームワークでは、このようなサイクルは許可されません。 たとえば、サイクルが見つかった場合、Json.NET は次の例外をスローします。
Newtonsoft.Json.JsonSerializationException: 'MyApplication.Models.Blog' 型のプロパティ 'Blog' の自己参照ループが検出されました。
System.Text.Json は、サイクルが検出された場合に同様の例外をスローします。
System.Text.Json.JsonException: 考えられるオブジェクト サイクルが検出されました。 これは、サイクルが原因であるか、オブジェクトの深さが最大許容深度 32 より大きい場合に発生する可能性があります。 循環をサポートするには、JsonSerializerOptions で ReferenceHandler.Preserve を使用することを検討してください。
ASP.NET Core で Json.NET を使用している場合は、オブジェクト グラフで検出されたサイクルを無視するように Json.NET を構成できます。 この構成は、ConfigureServices(...)の Startup.cs メソッドで行われます。
public void ConfigureServices(IServiceCollection services)
{
...
services.AddMvc()
.AddJsonOptions(
options => options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore
);
...
}
System.Text.Json を使用している場合は、次のように構成できます。
public void ConfigureServices(IServiceCollection services)
{
...
services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.ReferenceHandler = ReferenceHandler.IgnoreCycles;
});
...
}
もう 1 つの方法は、JSON シリアル化のサイクルの原因となるナビゲーション プロパティを無視することです。 Json.NET を使用している場合は、ナビゲーション プロパティの 1 つを [JsonIgnore] 属性で装飾できます。これにより、シリアル化中にそのナビゲーション プロパティを走査しないように Json.NET に指示されます。 System.Text.Json の場合、[JsonIgnore]名前空間のSystem.Text.Json.Serialization属性を使用して、同じ効果を得ることができます。
.NET