Skip to content

Commit 2139eed

Browse files
committed
Apply resolver and converter to JsonOptions
1 parent 76f78f8 commit 2139eed

File tree

2 files changed

+39
-8
lines changed

2 files changed

+39
-8
lines changed

src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/GrpcJsonTranscodingServiceExtensions.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
using Grpc.Shared;
77
using Microsoft.AspNetCore.Grpc.JsonTranscoding;
88
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Binding;
9+
using Microsoft.AspNetCore.Grpc.JsonTranscoding.Internal.Json;
10+
using Microsoft.AspNetCore.Http.Json;
911
using Microsoft.Extensions.DependencyInjection.Extensions;
1012
using Microsoft.Extensions.Options;
1113

@@ -27,6 +29,7 @@ public static IGrpcServerBuilder AddJsonTranscoding(this IGrpcServerBuilder buil
2729

2830
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton(typeof(IServiceMethodProvider<>), typeof(JsonTranscodingServiceMethodProvider<>)));
2931
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<GrpcJsonTranscodingOptions>, GrpcJsonTranscodingOptionsSetup>());
32+
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<IConfigureOptions<JsonOptions>, JsonOptionsSetup>());
3033
builder.Services.TryAddSingleton<DescriptorRegistry>();
3134

3235
return builder;
@@ -63,4 +66,25 @@ public void Configure(GrpcJsonTranscodingOptions options)
6366
options.DescriptorRegistry = _descriptorRegistry;
6467
}
6568
}
69+
70+
private sealed class JsonOptionsSetup : IConfigureOptions<JsonOptions>
71+
{
72+
private readonly DescriptorRegistry _descriptorRegistry;
73+
private readonly GrpcJsonTranscodingOptions _transcodingOptions;
74+
75+
public JsonOptionsSetup(DescriptorRegistry descriptorRegistry, IOptions<GrpcJsonTranscodingOptions> transcodingOptions)
76+
{
77+
_descriptorRegistry = descriptorRegistry;
78+
_transcodingOptions = transcodingOptions.Value;
79+
}
80+
81+
public void Configure(JsonOptions options)
82+
{
83+
ArgumentNullException.ThrowIfNull(options);
84+
85+
var context = new JsonContext(_transcodingOptions.JsonSettings, _transcodingOptions.TypeRegistry, _descriptorRegistry);
86+
87+
JsonConverterHelper.ApplyConverterAndTypeInfoSerializerOptions(options.SerializerOptions, context);
88+
}
89+
}
6690
}

src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/JsonConverterHelper.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,17 +37,26 @@ internal static JsonSerializerOptions CreateSerializerOptions(JsonContext contex
3737
// For streaming to work, indenting must be disabled when streaming.
3838
var writeIndented = !isStreamingOptions ? context.Settings.WriteIndented : false;
3939

40-
var typeInfoResolver = JsonTypeInfoResolver.Combine(
41-
new MessageTypeInfoResolver(context),
42-
new DefaultJsonTypeInfoResolver());
43-
4440
var options = new JsonSerializerOptions
4541
{
4642
WriteIndented = writeIndented,
4743
NumberHandling = JsonNumberHandling.AllowNamedFloatingPointLiterals,
48-
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
49-
TypeInfoResolver = typeInfoResolver
44+
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
5045
};
46+
47+
ApplyConverterAndTypeInfoSerializerOptions(options, context);
48+
49+
return options;
50+
}
51+
52+
internal static void ApplyConverterAndTypeInfoSerializerOptions(JsonSerializerOptions options, JsonContext context)
53+
{
54+
var typeInfoResolver = JsonTypeInfoResolver.Combine(
55+
new MessageTypeInfoResolver(context),
56+
options.TypeInfoResolver ?? new DefaultJsonTypeInfoResolver());
57+
58+
options.TypeInfoResolver = typeInfoResolver;
59+
5160
options.Converters.Add(new NullValueConverter());
5261
options.Converters.Add(new ByteStringConverter());
5362
options.Converters.Add(new Int64Converter(context));
@@ -56,8 +65,6 @@ internal static JsonSerializerOptions CreateSerializerOptions(JsonContext contex
5665
options.Converters.Add(new JsonConverterFactoryForEnum(context));
5766
options.Converters.Add(new JsonConverterFactoryForWrappers(context));
5867
options.Converters.Add(new JsonConverterFactoryForWellKnownTypes(context));
59-
60-
return options;
6168
}
6269

6370
internal static Type GetFieldType(FieldDescriptor descriptor)

0 commit comments

Comments
 (0)