Skip to content

Commit 25328d6

Browse files
authored
Move JsonNode to dynamic (RUC/RDC) side and add JsonElement as a static mapping (#5295)
1 parent 7d5ece2 commit 25328d6

4 files changed

Lines changed: 37 additions & 24 deletions

File tree

src/Npgsql/Internal/Resolvers/SystemTextJsonPocoTypeInfoResolver.cs renamed to src/Npgsql/Internal/Resolvers/SystemTextJsonDynamicTypeInfoResolver.cs

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Diagnostics.CodeAnalysis;
33
using System.Text;
44
using System.Text.Json;
5+
using System.Text.Json.Nodes;
56
using System.Text.Json.Serialization.Metadata;
67
using Npgsql.Internal.Converters;
78
using Npgsql.Internal.Postgres;
@@ -10,12 +11,12 @@ namespace Npgsql.Internal.Resolvers;
1011

1112
[RequiresUnreferencedCode("Json serializer may perform reflection on trimmed types.")]
1213
[RequiresDynamicCode("Serializing arbitary types to json can require creating new generic types or methods, which requires creating code at runtime. This may not work when AOT compiling.")]
13-
class SystemTextJsonPocoTypeInfoResolver : DynamicTypeInfoResolver, IPgTypeInfoResolver
14+
class SystemTextJsonDynamicTypeInfoResolver : DynamicTypeInfoResolver, IPgTypeInfoResolver
1415
{
1516
protected TypeInfoMappingCollection Mappings { get; } = new();
1617
protected JsonSerializerOptions _serializerOptions;
1718

18-
public SystemTextJsonPocoTypeInfoResolver(Type[]? jsonbClrTypes = null, Type[]? jsonClrTypes = null, JsonSerializerOptions? serializerOptions = null)
19+
public SystemTextJsonDynamicTypeInfoResolver(Type[]? jsonbClrTypes = null, Type[]? jsonClrTypes = null, JsonSerializerOptions? serializerOptions = null)
1920
{
2021
#if NET7_0_OR_GREATER
2122
_serializerOptions = serializerOptions ??= JsonSerializerOptions.Default;
@@ -31,6 +32,20 @@ void AddMappings(TypeInfoMappingCollection mappings, Type[] jsonbClrTypes, Type[
3132
// We do GetTypeInfo calls directly so we need a resolver.
3233
serializerOptions.TypeInfoResolver ??= new DefaultJsonTypeInfoResolver();
3334

35+
// These live in the RUC/RDC part as JsonValues can contain any .NET type.
36+
foreach (var dataTypeName in new[] { DataTypeNames.Jsonb, DataTypeNames.Json })
37+
{
38+
var jsonb = dataTypeName == DataTypeNames.Jsonb;
39+
mappings.AddType<JsonNode>(dataTypeName, (options, mapping, _) =>
40+
mapping.CreateInfo(options, new SystemTextJsonConverter<JsonNode, JsonNode>(jsonb, options.TextEncoding, serializerOptions)));
41+
mappings.AddType<JsonObject>(dataTypeName, (options, mapping, _) =>
42+
mapping.CreateInfo(options, new SystemTextJsonConverter<JsonObject, JsonObject>(jsonb, options.TextEncoding, serializerOptions)));
43+
mappings.AddType<JsonArray>(dataTypeName, (options, mapping, _) =>
44+
mapping.CreateInfo(options, new SystemTextJsonConverter<JsonArray, JsonArray>(jsonb, options.TextEncoding, serializerOptions)));
45+
mappings.AddType<JsonValue>(dataTypeName, (options, mapping, _) =>
46+
mapping.CreateInfo(options, new SystemTextJsonConverter<JsonValue, JsonValue>(jsonb, options.TextEncoding, serializerOptions)));
47+
}
48+
3449
AddUserMappings(jsonb: true, jsonbClrTypes);
3550
AddUserMappings(jsonb: false, jsonClrTypes);
3651

@@ -62,6 +77,14 @@ protected void AddArrayInfos(TypeInfoMappingCollection mappings, TypeInfoMapping
6277
if (baseMappings.Items.Count == 0)
6378
return;
6479

80+
foreach (var dataTypeName in new[] { DataTypeNames.Jsonb, DataTypeNames.Json })
81+
{
82+
mappings.AddArrayType<JsonNode>(dataTypeName);
83+
mappings.AddArrayType<JsonObject>(dataTypeName);
84+
mappings.AddArrayType<JsonArray>(dataTypeName);
85+
mappings.AddArrayType<JsonValue>(dataTypeName);
86+
}
87+
6588
var dynamicMappings = CreateCollection(baseMappings);
6689
foreach (var mapping in baseMappings.Items)
6790
dynamicMappings.AddArrayMapping(mapping.Type, mapping.DataTypeName);
@@ -102,11 +125,11 @@ static PgConverter CreateSystemTextJsonConverter(Type valueType, bool jsonb, Enc
102125

103126
[RequiresUnreferencedCode("Json serializer may perform reflection on trimmed types.")]
104127
[RequiresDynamicCode("Serializing arbitary types to json can require creating new generic types or methods, which requires creating code at runtime. This may not work when AOT compiling.")]
105-
sealed class SystemTextJsonPocoArrayTypeInfoResolver : SystemTextJsonPocoTypeInfoResolver, IPgTypeInfoResolver
128+
sealed class SystemTextJsonDynamicArrayTypeInfoResolver : SystemTextJsonDynamicTypeInfoResolver, IPgTypeInfoResolver
106129
{
107130
new TypeInfoMappingCollection Mappings { get; }
108131

109-
public SystemTextJsonPocoArrayTypeInfoResolver(Type[]? jsonbClrTypes = null, Type[]? jsonClrTypes = null, JsonSerializerOptions? serializerOptions = null)
132+
public SystemTextJsonDynamicArrayTypeInfoResolver(Type[]? jsonbClrTypes = null, Type[]? jsonClrTypes = null, JsonSerializerOptions? serializerOptions = null)
110133
: base(jsonbClrTypes, jsonClrTypes, serializerOptions)
111134
{
112135
Mappings = new TypeInfoMappingCollection(base.Mappings);

src/Npgsql/Internal/Resolvers/SystemTextJsonTypeInfoResolvers.cs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Diagnostics.CodeAnalysis;
33
using System.Text.Json;
4-
using System.Text.Json.Nodes;
54
using System.Text.Json.Serialization.Metadata;
65
using Npgsql.Internal.Converters;
76
using Npgsql.Internal.Postgres;
@@ -36,14 +35,8 @@ static void AddTypeInfos(TypeInfoMappingCollection mappings, JsonSerializerOptio
3635
mappings.AddType<JsonDocument>(dataTypeName, (options, mapping, _) =>
3736
mapping.CreateInfo(options, new SystemTextJsonConverter<JsonDocument, JsonDocument>(jsonb, options.TextEncoding, serializerOptions)),
3837
isDefault: true);
39-
mappings.AddType<JsonNode>(dataTypeName, (options, mapping, _) =>
40-
mapping.CreateInfo(options, new SystemTextJsonConverter<JsonNode, JsonNode>(jsonb, options.TextEncoding, serializerOptions)));
41-
mappings.AddType<JsonObject>(dataTypeName, (options, mapping, _) =>
42-
mapping.CreateInfo(options, new SystemTextJsonConverter<JsonObject, JsonObject>(jsonb, options.TextEncoding, serializerOptions)));
43-
mappings.AddType<JsonArray>(dataTypeName, (options, mapping, _) =>
44-
mapping.CreateInfo(options, new SystemTextJsonConverter<JsonArray, JsonArray>(jsonb, options.TextEncoding, serializerOptions)));
45-
mappings.AddType<JsonValue>(dataTypeName, (options, mapping, _) =>
46-
mapping.CreateInfo(options, new SystemTextJsonConverter<JsonValue, JsonValue>(jsonb, options.TextEncoding, serializerOptions)));
38+
mappings.AddStructType<JsonElement>(dataTypeName, (options, mapping, _) =>
39+
mapping.CreateInfo(options, new SystemTextJsonConverter<JsonElement, JsonElement>(jsonb, options.TextEncoding, serializerOptions)));
4740
}
4841
}
4942

@@ -52,10 +45,7 @@ protected static void AddArrayInfos(TypeInfoMappingCollection mappings)
5245
foreach (var dataTypeName in new[] { DataTypeNames.Jsonb, DataTypeNames.Json })
5346
{
5447
mappings.AddArrayType<JsonDocument>(dataTypeName);
55-
mappings.AddArrayType<JsonNode>(dataTypeName);
56-
mappings.AddArrayType<JsonObject>(dataTypeName);
57-
mappings.AddArrayType<JsonArray>(dataTypeName);
58-
mappings.AddArrayType<JsonValue>(dataTypeName);
48+
mappings.AddStructArrayType<JsonElement>(dataTypeName);
5949
}
6050
}
6151

src/Npgsql/NpgsqlDataSourceBuilder.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ internal static void ResetGlobalMappings(bool overwrite)
5757
overwrite ? new AdoTypeInfoResolver() : AdoTypeInfoResolver.Instance,
5858
new ExtraConversionsResolver(),
5959
new SystemTextJsonTypeInfoResolver(),
60-
new SystemTextJsonPocoTypeInfoResolver(),
60+
new SystemTextJsonDynamicTypeInfoResolver(),
6161
new RangeTypeInfoResolver(),
6262
new RecordTypeInfoResolver(),
6363
new TupledRecordTypeInfoResolver(),
@@ -72,7 +72,7 @@ internal static void ResetGlobalMappings(bool overwrite)
7272
new AdoArrayTypeInfoResolver(),
7373
new ExtraConversionsArrayTypeInfoResolver(),
7474
new SystemTextJsonArrayTypeInfoResolver(),
75-
new SystemTextJsonPocoArrayTypeInfoResolver(),
75+
new SystemTextJsonDynamicArrayTypeInfoResolver(),
7676
new RangeArrayTypeInfoResolver(),
7777
new RecordArrayTypeInfoResolver(),
7878
new TupledRecordArrayTypeInfoResolver(),
@@ -104,7 +104,7 @@ void AddDefaultFeatures()
104104
AddTypeInfoResolver(new TupledRecordArrayTypeInfoResolver());
105105
AddTypeInfoResolver(new RecordArrayTypeInfoResolver());
106106
AddTypeInfoResolver(new RangeArrayTypeInfoResolver());
107-
AddTypeInfoResolver(new SystemTextJsonPocoArrayTypeInfoResolver());
107+
AddTypeInfoResolver(new SystemTextJsonDynamicArrayTypeInfoResolver());
108108
AddTypeInfoResolver(new SystemTextJsonArrayTypeInfoResolver());
109109
AddTypeInfoResolver(new ExtraConversionsArrayTypeInfoResolver());
110110
AddTypeInfoResolver(new AdoArrayTypeInfoResolver());
@@ -119,7 +119,7 @@ void AddDefaultFeatures()
119119
AddTypeInfoResolver(new TupledRecordTypeInfoResolver());
120120
AddTypeInfoResolver(new RecordTypeInfoResolver());
121121
AddTypeInfoResolver(new RangeTypeInfoResolver());
122-
AddTypeInfoResolver(new SystemTextJsonPocoTypeInfoResolver());
122+
AddTypeInfoResolver(new SystemTextJsonDynamicTypeInfoResolver());
123123
AddTypeInfoResolver(new SystemTextJsonTypeInfoResolver());
124124
AddTypeInfoResolver(new ExtraConversionsResolver());
125125
AddTypeInfoResolver(AdoTypeInfoResolver.Instance);
@@ -307,8 +307,8 @@ public NpgsqlDataSourceBuilder UseSystemTextJson(
307307
Type[]? jsonbClrTypes = null,
308308
Type[]? jsonClrTypes = null)
309309
{
310-
AddTypeInfoResolver(new SystemTextJsonPocoArrayTypeInfoResolver(jsonbClrTypes, jsonClrTypes, serializerOptions));
311-
AddTypeInfoResolver(new SystemTextJsonPocoTypeInfoResolver(jsonbClrTypes, jsonClrTypes, serializerOptions));
310+
AddTypeInfoResolver(new SystemTextJsonDynamicArrayTypeInfoResolver(jsonbClrTypes, jsonClrTypes, serializerOptions));
311+
AddTypeInfoResolver(new SystemTextJsonDynamicTypeInfoResolver(jsonbClrTypes, jsonClrTypes, serializerOptions));
312312
return this;
313313
}
314314

src/Npgsql/NpgsqlSlimDataSourceBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ public NpgsqlSlimDataSourceBuilder UseSystemTextJson(
384384
Type[]? jsonbClrTypes = null,
385385
Type[]? jsonClrTypes = null)
386386
{
387-
AddTypeInfoResolver(new SystemTextJsonPocoTypeInfoResolver(jsonbClrTypes, jsonClrTypes, serializerOptions));
387+
AddTypeInfoResolver(new SystemTextJsonDynamicTypeInfoResolver(jsonbClrTypes, jsonClrTypes, serializerOptions));
388388
return this;
389389
}
390390

0 commit comments

Comments
 (0)