8
8
using System . Linq ;
9
9
using System . Text . Json ;
10
10
using System . Text . Json . Nodes ;
11
+ using System . Text . Json . Serialization ;
11
12
using System . Threading . Tasks ;
12
13
using System . Threading ;
13
14
using Elastic . Transport ;
@@ -16,6 +17,15 @@ namespace Elastic.Clients.Elasticsearch.Esql;
16
17
17
18
public partial class EsqlNamespacedClient
18
19
{
20
+ #pragma warning disable IL2026 , IL3050
21
+
22
+ private static readonly JsonSerializerOptions EsqlJsonSerializerOptions = new JsonSerializerOptions ( JsonSerializerOptions . Default )
23
+ {
24
+ TypeInfoResolver = EsqlJsonSerializerContext . Default
25
+ } ;
26
+
27
+ #pragma warning restore IL2026 , IL3050
28
+
19
29
/// <summary>
20
30
/// Executes an ES|QL request and returns the response as a stream.
21
31
/// </summary>
@@ -71,9 +81,8 @@ private static IEnumerable<T> EsqlToObject<T>(ElasticsearchClient client, EsqlQu
71
81
{
72
82
// TODO: Improve performance
73
83
74
- // TODO: fixme
75
84
#pragma warning disable IL2026 , IL3050
76
- using var doc = JsonSerializer . Deserialize < JsonDocument > ( response . Data ) ?? throw new JsonException ( ) ;
85
+ using var doc = JsonSerializer . Deserialize < JsonDocument > ( response . Data , EsqlJsonSerializerOptions ) ?? throw new JsonException ( ) ;
77
86
#pragma warning restore IL2026 , IL3050
78
87
79
88
if ( ! doc . RootElement . TryGetProperty ( "columns"u8 , out var columns ) || ( columns . ValueKind is not JsonValueKind . Array ) )
@@ -107,9 +116,17 @@ private static IEnumerable<T> EsqlToObject<T>(ElasticsearchClient client, EsqlQu
107
116
writer . Reset ( ) ;
108
117
109
118
var properties = names . Zip ( document . EnumerateArray ( ) ,
110
- ( key , value ) => new KeyValuePair < string , JsonNode ? > ( key , JsonValue . Create ( value ) ) ) ;
119
+ ( key , value ) => new KeyValuePair < string , JsonNode ? > ( key , value . ValueKind switch
120
+ {
121
+ JsonValueKind . Object => JsonObject . Create ( value ) ,
122
+ JsonValueKind . Array => JsonArray . Create ( value ) ,
123
+ _ => JsonValue . Create ( value )
124
+ } ) ) ;
125
+
111
126
foreach ( var property in properties )
127
+ {
112
128
obj . Add ( property ) ;
129
+ }
113
130
114
131
obj . WriteTo ( writer ) ;
115
132
writer . Flush ( ) ;
@@ -120,4 +137,8 @@ private static IEnumerable<T> EsqlToObject<T>(ElasticsearchClient client, EsqlQu
120
137
yield return result ;
121
138
}
122
139
}
140
+
141
+ [ JsonSerializable ( typeof ( JsonDocument ) ) ]
142
+ internal sealed partial class EsqlJsonSerializerContext :
143
+ JsonSerializerContext ;
123
144
}
0 commit comments