forked from npgsql/npgsql
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJsonNetTypeInfoResolver.cs
More file actions
67 lines (57 loc) · 2.77 KB
/
JsonNetTypeInfoResolver.cs
File metadata and controls
67 lines (57 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Text;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Npgsql.Internal;
using Npgsql.Internal.Postgres;
namespace Npgsql.Json.NET.Internal;
class JsonNetTypeInfoResolver : IPgTypeInfoResolver
{
protected TypeInfoMappingCollection Mappings { get; } = new();
public JsonNetTypeInfoResolver(JsonSerializerSettings? settings = null)
=> AddTypeInfos(Mappings, settings);
static void AddTypeInfos(TypeInfoMappingCollection mappings, JsonSerializerSettings? settings = null)
{
// Capture default settings during construction.
settings ??= JsonConvert.DefaultSettings?.Invoke() ?? new JsonSerializerSettings();
// Jsonb is the first default for JToken etc.
foreach (var dataTypeName in new[] { "jsonb", "json" })
{
var jsonb = dataTypeName == "jsonb";
mappings.AddType<JObject>(dataTypeName, (options, mapping, _) =>
mapping.CreateInfo(options, new JsonNetJsonConverter<JObject>(jsonb, options.TextEncoding, settings)),
isDefault: true);
mappings.AddType<JToken>(dataTypeName, (options, mapping, _) =>
mapping.CreateInfo(options, new JsonNetJsonConverter<JToken>(jsonb, options.TextEncoding, settings)));
mappings.AddType<JArray>(dataTypeName, (options, mapping, _) =>
mapping.CreateInfo(options, new JsonNetJsonConverter<JArray>(jsonb, options.TextEncoding, settings)));
mappings.AddType<JValue>(dataTypeName, (options, mapping, _) =>
mapping.CreateInfo(options, new JsonNetJsonConverter<JValue>(jsonb, options.TextEncoding, settings)));
}
}
protected static void AddArrayInfos(TypeInfoMappingCollection mappings)
{
foreach (var dataTypeName in new[] { "jsonb", "json" })
{
mappings.AddArrayType<JObject>(dataTypeName);
mappings.AddArrayType<JToken>(dataTypeName);
mappings.AddArrayType<JArray>(dataTypeName);
mappings.AddArrayType<JValue>(dataTypeName);
}
}
public PgTypeInfo? GetTypeInfo(Type? type, DataTypeName? dataTypeName, PgSerializerOptions options)
=> Mappings.Find(type, dataTypeName, options);
}
sealed class JsonNetArrayTypeInfoResolver : JsonNetTypeInfoResolver, IPgTypeInfoResolver
{
new TypeInfoMappingCollection Mappings { get; }
public JsonNetArrayTypeInfoResolver(JsonSerializerSettings? settings = null) : base(settings)
{
Mappings = new TypeInfoMappingCollection(base.Mappings);
AddArrayInfos(Mappings);
}
public new PgTypeInfo? GetTypeInfo(Type? type, DataTypeName? dataTypeName, PgSerializerOptions options)
=> Mappings.Find(type, dataTypeName, options);
}