Skip to content

Commit 58072b4

Browse files
authored
Accept null values in arrays (#68)
1 parent a116aa3 commit 58072b4

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

java-client/src/main/java/co/elastic/clients/json/JsonpDeserializerBase.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,8 +312,13 @@ public List<T> deserialize(JsonParser parser, JsonpMapper mapper, Event event) {
312312
if (event == Event.START_ARRAY) {
313313
List<T> result = new ArrayList<>();
314314
while ((event = parser.next()) != Event.END_ARRAY) {
315-
JsonpUtils.ensureAccepts(itemDeserializer, parser, event);
316-
result.add(itemDeserializer.deserialize(parser, mapper, event));
315+
// JSON null: add null unless the deserializer can handle it
316+
if (event == Event.VALUE_NULL && !itemDeserializer.accepts(event)) {
317+
result.add(null);
318+
} else {
319+
JsonpUtils.ensureAccepts(itemDeserializer, parser, event);
320+
result.add(itemDeserializer.deserialize(parser, mapper, event));
321+
}
317322
}
318323
return result;
319324
} else {

java-client/src/test/java/co/elastic/clients/elasticsearch/model/BuiltinTypesTest.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,11 @@
2727
import co.elastic.clients.elasticsearch._types.query_dsl.SpanGapQuery;
2828
import co.elastic.clients.elasticsearch.core.SearchRequest;
2929
import co.elastic.clients.elasticsearch.indices.IndexSettings;
30+
import co.elastic.clients.json.JsonpDeserializer;
31+
import jakarta.json.stream.JsonParser;
3032
import org.junit.Test;
3133

34+
import java.io.StringReader;
3235
import java.util.List;
3336

3437
public class BuiltinTypesTest extends ModelTestCase {
@@ -50,6 +53,38 @@ public void testLenientArray() {
5053
assertGetterType(List.class, SearchRequest.class, "index");
5154
}
5255

56+
@Test
57+
public void testNullArrayItem() {
58+
// See https://github.com/elastic/elasticsearch-java/issues/66
59+
60+
String json = "[\"a\", null, \"c\"]";
61+
62+
// Types that don't accept null events should end up as null values in the list
63+
{
64+
JsonpDeserializer<String> stringDeser = JsonpDeserializer.stringDeserializer();
65+
assertFalse(stringDeser.accepts(JsonParser.Event.VALUE_NULL));
66+
67+
JsonParser parser = mapper.jsonProvider().createParser(new StringReader(json));
68+
69+
List<String> stringList = JsonpDeserializer.arrayDeserializer(stringDeser).deserialize(parser, mapper);
70+
assertEquals("a", stringList.get(0));
71+
assertNull(stringList.get(1));
72+
assertEquals("c", stringList.get(2));
73+
}
74+
75+
// Types that do accept null events should end up as their null representation
76+
{
77+
assertTrue(FieldValue._DESERIALIZER.accepts(JsonParser.Event.VALUE_NULL));
78+
79+
JsonParser parser = mapper.jsonProvider().createParser(new StringReader(json));
80+
List<FieldValue> valueList = JsonpDeserializer.arrayDeserializer(FieldValue._DESERIALIZER).deserialize(parser, mapper);
81+
82+
assertEquals("a", valueList.get(0)._get());
83+
assertTrue(valueList.get(1).isNull());
84+
assertEquals("c", valueList.get(2)._get());
85+
}
86+
}
87+
5388
@Test
5489
public void testSpanGapQuery() {
5590
// Hand-written class

0 commit comments

Comments
 (0)