diff --git a/src/Elastic.Clients.Elasticsearch/Serialization/UnionConverter.cs b/src/Elastic.Clients.Elasticsearch/Serialization/UnionConverter.cs index 20019610188..9908f3013fc 100644 --- a/src/Elastic.Clients.Elasticsearch/Serialization/UnionConverter.cs +++ b/src/Elastic.Clients.Elasticsearch/Serialization/UnionConverter.cs @@ -122,12 +122,6 @@ private class DerivedUnionConverterInner : JsonConverter< public override void Write(Utf8JsonWriter writer, TType value, JsonSerializerOptions options) { - if (value is null) - { - writer.WriteNullValue(); - return; - } - if (value.Item1 is not null) { JsonSerializer.Serialize(writer, value.Item1, value.Item1.GetType(), options); @@ -214,15 +208,30 @@ private class BucketsConverter : JsonConverter> { public override Buckets? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - // TODO - Read ahead to establish the type - For now, hardcoded for lists + return reader.TokenType switch + { + JsonTokenType.Null => null, + JsonTokenType.StartArray => new(JsonSerializer.Deserialize>(ref reader, options)), + JsonTokenType.StartObject => new(JsonSerializer.Deserialize>(ref reader, options)), + _ => throw new JsonException("Invalid bucket type") + }; + } - var bucketType = typeToConvert.GetGenericArguments()[0]; + public override void Write(Utf8JsonWriter writer, Buckets value, JsonSerializerOptions options) + { + if (value.Item1 is { } item1) + { + JsonSerializer.Serialize(writer, item1, options); + return; + } - var item = JsonSerializer.Deserialize(ref reader, typeof(IReadOnlyCollection), options); + if (value.Item2 is { } item2) + { + JsonSerializer.Serialize(writer, item2, options); + return; + } - return (Buckets)Activator.CreateInstance(typeof(Buckets<>).MakeGenericType(bucketType), item); + writer.WriteNullValue(); } - - public override void Write(Utf8JsonWriter writer, Buckets value, JsonSerializerOptions options) => throw new NotImplementedException(); } }