forked from dotnet/aspnetcore
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use Json TypeInfoResolverChain (dotnet#47450)
* Use Json TypeInfoResolverChain - Removes all usages of JsonSerializerOptions.AddContext, which will be obsoleted by dotnet/runtime#83280 - Update ProblemDetailsJsonContext to be added in a Configure<JsonOptions>() call back and to always be added to the beginning of the resolver chain at that time - This gives us the simplest, most understandable pattern for all libraries to follow. - Small clean up in the API template's usings * Change ProblemDetailsJsonOptionsSetup to use Configure instead of PostConfigure. When adding the ProblemDetailsJsonContext, we always prepend it to the beginning of the chain at the time the configure step is executed, no matter the state of the chain. This allows for a simpler, more understandable policy for all libraries that want to add their JsonContext into the JsonSerializerOptions resolver chain. The order of the chain is now determined by the order that the configure steps were registered in DI (for example when AddProblemDetails() was called).
- Loading branch information
Showing
8 changed files
with
110 additions
and
49 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
35 changes: 14 additions & 21 deletions
35
src/Http/Http.Extensions/src/ProblemDetailsJsonOptionsSetup.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,33 +1,26 @@ | ||
// Licensed to the .NET Foundation under one or more agreements. | ||
// The .NET Foundation licenses this file to you under the MIT license. | ||
|
||
using System.Text.Json.Serialization.Metadata; | ||
using Microsoft.AspNetCore.Http.Json; | ||
using Microsoft.Extensions.Options; | ||
|
||
namespace Microsoft.AspNetCore.Http; | ||
|
||
internal sealed class ProblemDetailsJsonOptionsSetup : IPostConfigureOptions<JsonOptions> | ||
/// <summary> | ||
/// Adds the ProblemDetailsJsonContext to the current JsonSerializerOptions. | ||
/// | ||
/// This allows for consistent serialization behavior for ProblemDetails regardless if | ||
/// the default reflection-based serializer is used or not. And makes it trim/NativeAOT compatible. | ||
/// </summary> | ||
internal sealed class ProblemDetailsJsonOptionsSetup : IConfigureOptions<JsonOptions> | ||
{ | ||
public void PostConfigure(string? name, JsonOptions options) | ||
public void Configure(JsonOptions options) | ||
{ | ||
switch (options.SerializerOptions.TypeInfoResolver) | ||
{ | ||
case DefaultJsonTypeInfoResolver: | ||
// In this case, the current configuration is using a reflection-based resolver | ||
// and we are prepending our internal problem details context to be evaluated | ||
// first. | ||
options.SerializerOptions.TypeInfoResolver = JsonTypeInfoResolver.Combine(ProblemDetailsJsonContext.Default, options.SerializerOptions.TypeInfoResolver); | ||
break; | ||
case not null: | ||
// Combine the current resolver with our internal problem details context (adding last) | ||
options.SerializerOptions.AddContext<ProblemDetailsJsonContext>(); | ||
break; | ||
default: | ||
// Not adding our source gen context when TypeInfoResolver == null | ||
// since adding it will skip the reflection-based resolver and potentially | ||
// cause unexpected serialization problems | ||
break; | ||
} | ||
// Always insert the ProblemDetailsJsonContext to the beginning of the chain at the time | ||
// this Configure is invoked. This JsonTypeInfoResolver will be before the default reflection-based resolver, | ||
// and before any other resolvers currently added. | ||
// If apps need to customize ProblemDetails serialization, they can prepend a custom ProblemDetails resolver | ||
// to the chain in an IConfigureOptions<JsonOptions> registered after the call to AddProblemDetails(). | ||
options.SerializerOptions.TypeInfoResolverChain.Insert(0, new ProblemDetailsJsonContext()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters