Skip to content

Commit d85ae3e

Browse files
committed
Support custom JsonSerializerOptions
1 parent b92934e commit d85ae3e

File tree

30 files changed

+878
-120
lines changed

30 files changed

+878
-120
lines changed

src/Elastic.Clients.Elasticsearch/Core/Configuration/ElasticsearchClientSettings.cs

+3-9
Original file line numberDiff line numberDiff line change
@@ -115,18 +115,12 @@ protected ElasticsearchClientSettingsBase(
115115
: base(nodePool, connection, null, ElasticsearchClientProductRegistration.DefaultForElasticsearchClientsElasticsearch)
116116
{
117117
var requestResponseSerializer = new DefaultRequestResponseSerializer(this);
118-
var sourceSerializer = sourceSerializerFactory?.Invoke(requestResponseSerializer, this) ?? new DefaultSourceSerializer(this);
118+
var sourceSerializer = new DefaultSourceSerializer(this);
119119

120-
_propertyMappingProvider = propertyMappingProvider ?? sourceSerializer as IPropertyMappingProvider ?? new DefaultPropertyMappingProvider();
121-
122-
// TODO - Serializer implementations should directly call diagnostics to avoid wrapping
123-
//We wrap these in an internal proxy to facilitate serialization diagnostics
124-
//_sourceSerializer = new DiagnosticsSerializerProxy(sourceSerializer, "source");
125-
_sourceSerializer = sourceSerializer;
126-
127-
//UseThisRequestResponseSerializer = new DiagnosticsSerializerProxy(defaultSerializer);
128120
UseThisRequestResponseSerializer = requestResponseSerializer;
129121

122+
_sourceSerializer = sourceSerializerFactory?.Invoke(sourceSerializer, this) ?? sourceSerializer;
123+
_propertyMappingProvider = propertyMappingProvider ?? sourceSerializer as IPropertyMappingProvider ?? new DefaultPropertyMappingProvider();
130124
_defaultFieldNameInferrer = p => p.ToCamelCase();
131125
_defaultIndices = new FluentDictionary<Type, string>();
132126
_defaultRelationNames = new FluentDictionary<Type, string>();

src/Elastic.Clients.Elasticsearch/Core/Fields/FieldValues.cs

+15-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using System.Linq.Expressions;
99
using System.Text.Json;
1010
using System.Text.Json.Serialization;
11+
using Elastic.Clients.Elasticsearch.Serialization;
1112

1213
namespace Elastic.Clients.Elasticsearch;
1314

@@ -98,12 +99,12 @@ private TValue[] FieldArray<TValue>(string field)
9899

99100
internal sealed class FieldValuesConverter : JsonConverter<FieldValues>
100101
{
101-
private readonly IElasticsearchClientSettings _settings;
102-
103-
public FieldValuesConverter(IElasticsearchClientSettings settings) => _settings = settings;
102+
private IElasticsearchClientSettings _settings;
104103

105104
public override FieldValues? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
106105
{
106+
InitializeSettings(options);
107+
107108
if (reader.TokenType != JsonTokenType.StartObject)
108109
{
109110
return null;
@@ -126,4 +127,15 @@ internal sealed class FieldValuesConverter : JsonConverter<FieldValues>
126127
}
127128

128129
public override void Write(Utf8JsonWriter writer, FieldValues value, JsonSerializerOptions options) => throw new NotImplementedException();
130+
131+
private void InitializeSettings(JsonSerializerOptions options)
132+
{
133+
if (_settings is null)
134+
{
135+
if (!options.TryGetClientSettings(out var settings))
136+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
137+
138+
_settings = settings;
139+
}
140+
}
129141
}

src/Elastic.Clients.Elasticsearch/Core/Infer/Field/FieldConverter.cs

+20-4
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@
55
using System;
66
using System.Text.Json;
77
using System.Text.Json.Serialization;
8+
using Elastic.Clients.Elasticsearch.Serialization;
89
using Elastic.Transport;
910

1011
namespace Elastic.Clients.Elasticsearch;
1112

1213
internal sealed class FieldConverter : JsonConverter<Field>
1314
{
14-
private readonly IElasticsearchClientSettings _settings;
15+
private IElasticsearchClientSettings _settings;
1516

16-
public FieldConverter(IElasticsearchClientSettings settings) => _settings = settings;
17-
18-
public override void WriteAsPropertyName(Utf8JsonWriter writer, Field value, JsonSerializerOptions options) => writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
17+
public override void WriteAsPropertyName(Utf8JsonWriter writer, Field value, JsonSerializerOptions options)
18+
{
19+
InitializeSettings(options);
20+
writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
21+
}
1922

2023
public override Field ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => reader.GetString();
2124

@@ -72,6 +75,8 @@ private static Field ReadObjectField(ref Utf8JsonReader reader)
7275

7376
public override void Write(Utf8JsonWriter writer, Field value, JsonSerializerOptions options)
7477
{
78+
InitializeSettings(options);
79+
7580
if (value is null)
7681
{
7782
writer.WriteNullValue();
@@ -94,4 +99,15 @@ public override void Write(Utf8JsonWriter writer, Field value, JsonSerializerOpt
9499
writer.WriteEndObject();
95100
}
96101
}
102+
103+
private void InitializeSettings(JsonSerializerOptions options)
104+
{
105+
if (_settings is null)
106+
{
107+
if (!options.TryGetClientSettings(out var settings))
108+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
109+
110+
_settings = settings;
111+
}
112+
}
97113
}

src/Elastic.Clients.Elasticsearch/Core/Infer/Id/IdConverter.cs

+19-4
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@
55
using System;
66
using System.Text.Json;
77
using System.Text.Json.Serialization;
8+
using Elastic.Clients.Elasticsearch.Serialization;
89
using Elastic.Transport;
910

1011
namespace Elastic.Clients.Elasticsearch;
1112

1213
internal sealed class IdConverter : JsonConverter<Id>
1314
{
14-
private readonly IElasticsearchClientSettings _settings;
15+
private IElasticsearchClientSettings? _settings;
1516

16-
public IdConverter(IElasticsearchClientSettings settings) => _settings = settings;
17-
18-
public override void WriteAsPropertyName(Utf8JsonWriter writer, Id value, JsonSerializerOptions options) => writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
17+
public override void WriteAsPropertyName(Utf8JsonWriter writer, Id value, JsonSerializerOptions options)
18+
{
19+
InitializeSettings(options);
20+
writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
21+
}
1922

2023
public override Id ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => reader.GetString();
2124

@@ -34,6 +37,7 @@ public override void Write(Utf8JsonWriter writer, Id value, JsonSerializerOption
3437

3538
if (value.Document is not null)
3639
{
40+
InitializeSettings(options);
3741
var documentId = _settings.Inferrer.Id(value.Document.GetType(), value.Document);
3842
writer.WriteStringValue(documentId);
3943
}
@@ -46,4 +50,15 @@ public override void Write(Utf8JsonWriter writer, Id value, JsonSerializerOption
4650
writer.WriteStringValue(value.StringValue);
4751
}
4852
}
53+
54+
private void InitializeSettings(JsonSerializerOptions options)
55+
{
56+
if (_settings is null)
57+
{
58+
if (!options.TryGetClientSettings(out var settings))
59+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
60+
61+
_settings = settings;
62+
}
63+
}
4964
}

src/Elastic.Clients.Elasticsearch/Core/Infer/Id/Ids.cs

-4
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,6 @@ public override int GetHashCode()
8787

8888
internal sealed class IdsConverter : JsonConverter<Ids>
8989
{
90-
private readonly IElasticsearchClientSettings _settings;
91-
92-
public IdsConverter(IElasticsearchClientSettings settings) => _settings = settings;
93-
9490
public override Ids? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
9591
{
9692
if (reader.TokenType != JsonTokenType.StartArray)

src/Elastic.Clients.Elasticsearch/Core/Infer/IndexName/IndexName.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
using System;
66
using System.Diagnostics;
7+
using System.Text.Json.Serialization;
78
using Elastic.Transport;
89

910
namespace Elastic.Clients.Elasticsearch;
1011

1112
/// <summary>
1213
/// Represents the name of an index, which may be inferred from a <see cref="Type"/>.
1314
/// </summary>
15+
[JsonConverter(typeof(IndexNameConverter))]
1416
[DebuggerDisplay("{DebugDisplay,nq}")]
1517
public class IndexName : IEquatable<IndexName>, IUrlParameter
1618
{
@@ -48,7 +50,7 @@ private IndexName(string index, Type type, string cluster = null)
4850
string IUrlParameter.GetString(ITransportConfiguration settings)
4951
{
5052
if (settings is not IElasticsearchClientSettings elasticsearchClientSettings)
51-
throw new Exception("Tried to pass index name on querystring but it could not be resolved because no Elastic.Clients.Elasticsearch settings are available.");
53+
throw new Exception("Tried to pass index name on query string but it could not be resolved because no Elastic.Clients.Elasticsearch settings are available.");
5254

5355
return elasticsearchClientSettings.Inferrer.IndexName(this);
5456
}

src/Elastic.Clients.Elasticsearch/Core/Infer/IndexName/IndexNameConverter.cs

+21-5
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,23 @@
55
using System;
66
using System.Text.Json;
77
using System.Text.Json.Serialization;
8+
using Elastic.Clients.Elasticsearch.Serialization;
89
using Elastic.Transport;
910

1011
namespace Elastic.Clients.Elasticsearch;
1112

1213
/// <summary>
1314
/// Converts an <see cref="IndexName"/> to and from its JSON representation.
1415
/// </summary>
15-
internal class IndexNameConverter : JsonConverter<IndexName?>
16+
internal class IndexNameConverter : JsonConverter<IndexName>
1617
{
17-
private readonly IElasticsearchClientSettings _settings;
18+
private IElasticsearchClientSettings _settings;
1819

19-
public IndexNameConverter(IElasticsearchClientSettings settings) => _settings = settings;
20-
21-
public override void WriteAsPropertyName(Utf8JsonWriter writer, IndexName value, JsonSerializerOptions options) => writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
20+
public override void WriteAsPropertyName(Utf8JsonWriter writer, IndexName value, JsonSerializerOptions options)
21+
{
22+
InitializeSettings(options);
23+
writer.WritePropertyName(((IUrlParameter)value).GetString(_settings));
24+
}
2225

2326
public override IndexName ReadAsPropertyName(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) => reader.GetString();
2427

@@ -36,6 +39,8 @@ internal class IndexNameConverter : JsonConverter<IndexName?>
3639

3740
public override void Write(Utf8JsonWriter writer, IndexName? value, JsonSerializerOptions options)
3841
{
42+
InitializeSettings(options);
43+
3944
if (value is null)
4045
{
4146
writer.WriteNullValue();
@@ -44,4 +49,15 @@ public override void Write(Utf8JsonWriter writer, IndexName? value, JsonSerializ
4449

4550
writer.WriteStringValue(_settings.Inferrer.IndexName(value));
4651
}
52+
53+
private void InitializeSettings(JsonSerializerOptions options)
54+
{
55+
if (_settings is null)
56+
{
57+
if (!options.TryGetClientSettings(out var settings))
58+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
59+
60+
_settings = settings;
61+
}
62+
}
4763
}

src/Elastic.Clients.Elasticsearch/Core/Infer/Indices/Indices.cs

+15-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Linq;
1010
using System.Text.Json;
1111
using System.Text.Json.Serialization;
12+
using Elastic.Clients.Elasticsearch.Serialization;
1213
using Elastic.Transport;
1314

1415
namespace Elastic.Clients.Elasticsearch;
@@ -191,9 +192,7 @@ public override int GetHashCode()
191192

192193
internal sealed class IndicesJsonConverter : JsonConverter<Indices>
193194
{
194-
private readonly IElasticsearchClientSettings _settings;
195-
196-
public IndicesJsonConverter(IElasticsearchClientSettings settings) => _settings = settings;
195+
private IElasticsearchClientSettings _settings;
197196

198197
public override Indices? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
199198
{
@@ -219,6 +218,8 @@ internal sealed class IndicesJsonConverter : JsonConverter<Indices>
219218

220219
public override void Write(Utf8JsonWriter writer, Indices value, JsonSerializerOptions options)
221220
{
221+
InitializeSettings(options);
222+
222223
if (value == null)
223224
{
224225
writer.WriteNullValue();
@@ -227,4 +228,15 @@ public override void Write(Utf8JsonWriter writer, Indices value, JsonSerializerO
227228

228229
writer.WriteStringValue(((IUrlParameter)value).GetString(_settings));
229230
}
231+
232+
private void InitializeSettings(JsonSerializerOptions options)
233+
{
234+
if (_settings is null)
235+
{
236+
if (!options.TryGetClientSettings(out var settings))
237+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
238+
239+
_settings = settings;
240+
}
241+
}
230242
}

src/Elastic.Clients.Elasticsearch/Core/Infer/JoinFieldConverter.cs

+16-4
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
using System.Text.Json.Serialization;
77
using System.Text.Json;
88
using Elastic.Transport;
9+
using Elastic.Clients.Elasticsearch.Serialization;
10+
using System.Runtime;
911

1012
namespace Elastic.Clients.Elasticsearch;
1113

1214
internal sealed class JoinFieldConverter : JsonConverter<JoinField>
1315
{
14-
private readonly IElasticsearchClientSettings _elasticsearchClientSettings;
15-
16-
public JoinFieldConverter(IElasticsearchClientSettings elasticsearchClientSettings) => _elasticsearchClientSettings = elasticsearchClientSettings;
16+
private IElasticsearchClientSettings _settings;
1717

1818
public override JoinField? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1919
{
@@ -67,14 +67,26 @@ public override void Write(Utf8JsonWriter writer, JoinField value, JsonSerialize
6767
break;
6868

6969
case 1:
70+
InitializeSettings(options);
7071
writer.WriteStartObject();
7172
writer.WritePropertyName("name");
7273
JsonSerializer.Serialize(writer, value.ChildOption.Name, options);
7374
writer.WritePropertyName("parent");
74-
var id = (value.ChildOption.ParentId as IUrlParameter)?.GetString(_elasticsearchClientSettings);
75+
var id = (value.ChildOption.ParentId as IUrlParameter)?.GetString(_settings);
7576
writer.WriteStringValue(id);
7677
writer.WriteEndObject();
7778
break;
7879
}
7980
}
81+
82+
private void InitializeSettings(JsonSerializerOptions options)
83+
{
84+
if (_settings is null)
85+
{
86+
if (!options.TryGetClientSettings(out var settings))
87+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
88+
89+
_settings = settings;
90+
}
91+
}
8092
}

src/Elastic.Clients.Elasticsearch/Core/Infer/JoinFieldRouting/RoutingConverter.cs

+16-3
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@
55
using System;
66
using System.Text.Json;
77
using System.Text.Json.Serialization;
8+
using Elastic.Clients.Elasticsearch.Serialization;
89

910
namespace Elastic.Clients.Elasticsearch;
1011

1112
internal sealed class RoutingConverter : JsonConverter<Routing>
1213
{
13-
private readonly IElasticsearchClientSettings _settings;
14-
15-
public RoutingConverter(IElasticsearchClientSettings settings) => _settings = settings;
14+
private IElasticsearchClientSettings _settings;
1615

1716
public override Routing? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) =>
1817
reader.TokenType == JsonTokenType.Number
@@ -29,6 +28,8 @@ public override void Write(Utf8JsonWriter writer, Routing value, JsonSerializerO
2928

3029
if (value.Document is not null)
3130
{
31+
InitializeSettings(options);
32+
3233
var documentId = _settings.Inferrer.Routing(value.Document.GetType(), value.Document);
3334

3435
if (documentId is null)
@@ -42,6 +43,7 @@ public override void Write(Utf8JsonWriter writer, Routing value, JsonSerializerO
4243
else if (value.DocumentGetter is not null)
4344
{
4445
var doc = value.DocumentGetter();
46+
InitializeSettings(options);
4547
var documentId = _settings.Inferrer.Routing(doc.GetType(), doc);
4648
writer.WriteStringValue(documentId);
4749
}
@@ -54,4 +56,15 @@ public override void Write(Utf8JsonWriter writer, Routing value, JsonSerializerO
5456
writer.WriteStringValue(value.StringValue);
5557
}
5658
}
59+
60+
private void InitializeSettings(JsonSerializerOptions options)
61+
{
62+
if (_settings is null)
63+
{
64+
if (!options.TryGetClientSettings(out var settings))
65+
ThrowHelper.ThrowJsonExceptionForMissingSettings();
66+
67+
_settings = settings;
68+
}
69+
}
5770
}

0 commit comments

Comments
 (0)