Skip to content

Commit c9fdf05

Browse files
authored
Fix KeyValuePairConverter (#8579)
1 parent 5fcdb3c commit c9fdf05

File tree

2 files changed

+7
-23
lines changed

2 files changed

+7
-23
lines changed

src/Elastic.Clients.Elasticsearch/_Shared/Serialization/DefaultRequestResponseSerializer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ internal DefaultRequestResponseSerializerOptionsProvider(IElasticsearchClientSet
9595

9696
private static IReadOnlyCollection<JsonConverter> CreateDefaultBuiltInConverters(IElasticsearchClientSettings settings) =>
9797
[
98-
new KeyValuePairConverterFactory(settings),
98+
new KeyValuePairConverterFactory(),
9999
new ObjectToInferredTypesConverter(),
100100
new SourceConverterFactory(settings),
101101
new SelfSerializableConverterFactory(settings),

src/Elastic.Clients.Elasticsearch/_Shared/Serialization/KeyValuePairConverter.cs

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,10 @@
77
using System.Text.Json;
88
using System.Text.Json.Serialization;
99

10-
using Elastic.Transport;
11-
1210
namespace Elastic.Clients.Elasticsearch.Serialization;
1311

1412
internal sealed class KeyValuePairConverterFactory : JsonConverterFactory
1513
{
16-
private readonly IElasticsearchClientSettings _settings;
17-
18-
public KeyValuePairConverterFactory(IElasticsearchClientSettings settings) => _settings = settings;
19-
2014
public override bool CanConvert(Type typeToConvert) =>
2115
typeToConvert.IsGenericType &&
2216
typeToConvert.GetGenericTypeDefinition() == typeof(KeyValuePair<,>);
@@ -28,29 +22,25 @@ public override JsonConverter CreateConverter(
2822
var itemOneType = type.GetGenericArguments()[0];
2923
var itemTwoType = type.GetGenericArguments()[1];
3024

31-
return (JsonConverter)Activator.CreateInstance(typeof(KeyValuePairConverter<,>).MakeGenericType(itemOneType, itemTwoType), _settings);
25+
return (JsonConverter)Activator.CreateInstance(typeof(KeyValuePairConverter<,>).MakeGenericType(itemOneType, itemTwoType));
3226
}
3327

3428
private class KeyValuePairConverter<TItem1, TItem2> : JsonConverter<KeyValuePair<TItem1, TItem2>>
3529
{
36-
private readonly IElasticsearchClientSettings _settings;
37-
38-
public KeyValuePairConverter(IElasticsearchClientSettings settings) => _settings = settings;
39-
4030
public override KeyValuePair<TItem1, TItem2> Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
4131
{
4232
if (reader.TokenType != JsonTokenType.StartObject)
4333
throw new JsonException("Unexpected token for KeyValuePair");
4434

4535
reader.Read(); // property name (key)
46-
var keyString = reader.GetString();
36+
var converter = (JsonConverter<TItem1>)options.GetConverter(typeof(TItem1));
37+
var key = converter.ReadAsPropertyName(ref reader, typeof(TItem1), options);
4738

4839
reader.Read(); // value
4940
var value = JsonSerializer.Deserialize<TItem2>(ref reader, options);
5041

5142
reader.Read(); // end object
5243

53-
var key = (TItem1)Activator.CreateInstance(typeof(TItem1), keyString);
5444
return new KeyValuePair<TItem1, TItem2>(key, value);
5545
}
5646

@@ -59,16 +49,10 @@ public override void Write(Utf8JsonWriter writer, KeyValuePair<TItem1, TItem2> v
5949
{
6050
writer.WriteStartObject();
6151

62-
if (value.Key is IUrlParameter parameter)
63-
{
64-
writer.WritePropertyName(parameter.GetString(_settings));
65-
}
66-
else
67-
{
68-
writer.WritePropertyName(value.Key.ToString());
69-
}
52+
var converter = (JsonConverter<TItem1>)options.GetConverter(typeof(TItem1));
53+
converter.WriteAsPropertyName(writer, value.Key, options);
54+
JsonSerializer.Serialize(writer, value.Value, options);
7055

71-
JsonSerializer.Serialize<TItem2>(writer, value.Value, options);
7256
writer.WriteEndObject();
7357
}
7458
}

0 commit comments

Comments
 (0)