diff --git a/src/Elastic.Clients.Elasticsearch/_Shared/Client/ElasticsearchClient.Esql.cs b/src/Elastic.Clients.Elasticsearch/_Shared/Client/ElasticsearchClient.Esql.cs index 7bf53b079db..75b5f395ab5 100644 --- a/src/Elastic.Clients.Elasticsearch/_Shared/Client/ElasticsearchClient.Esql.cs +++ b/src/Elastic.Clients.Elasticsearch/_Shared/Client/ElasticsearchClient.Esql.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Text.Json; using System.Text.Json.Nodes; +using System.Text.Json.Serialization; using System.Threading.Tasks; using System.Threading; using Elastic.Transport; @@ -16,6 +17,15 @@ namespace Elastic.Clients.Elasticsearch.Esql; public partial class EsqlNamespacedClient { +#pragma warning disable IL2026, IL3050 + + private static readonly JsonSerializerOptions EsqlJsonSerializerOptions = new JsonSerializerOptions(JsonSerializerOptions.Default) + { + TypeInfoResolver = EsqlJsonSerializerContext.Default + }; + +#pragma warning restore IL2026, IL3050 + /// /// Executes an ES|QL request and returns the response as a stream. /// @@ -71,9 +81,8 @@ private static IEnumerable EsqlToObject(ElasticsearchClient client, EsqlQu { // TODO: Improve performance - // TODO: fixme #pragma warning disable IL2026, IL3050 - using var doc = JsonSerializer.Deserialize(response.Data) ?? throw new JsonException(); + using var doc = JsonSerializer.Deserialize(response.Data, EsqlJsonSerializerOptions) ?? throw new JsonException(); #pragma warning restore IL2026, IL3050 if (!doc.RootElement.TryGetProperty("columns"u8, out var columns) || (columns.ValueKind is not JsonValueKind.Array)) @@ -107,9 +116,17 @@ private static IEnumerable EsqlToObject(ElasticsearchClient client, EsqlQu writer.Reset(); var properties = names.Zip(document.EnumerateArray(), - (key, value) => new KeyValuePair(key, JsonValue.Create(value))); + (key, value) => new KeyValuePair(key, value.ValueKind switch + { + JsonValueKind.Object => JsonObject.Create(value), + JsonValueKind.Array => JsonArray.Create(value), + _ => JsonValue.Create(value) + })); + foreach (var property in properties) + { obj.Add(property); + } obj.WriteTo(writer); writer.Flush(); @@ -120,4 +137,8 @@ private static IEnumerable EsqlToObject(ElasticsearchClient client, EsqlQu yield return result; } } + + [JsonSerializable(typeof(JsonDocument))] + internal sealed partial class EsqlJsonSerializerContext : + JsonSerializerContext; }