Skip to content

Commit 28333bd

Browse files
committed
Additional json decoding tests and bugfix
1 parent 3802568 commit 28333bd

File tree

13 files changed

+146
-33
lines changed

13 files changed

+146
-33
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ public JsonValue toJson(JsonpMapper mapper) {
5858
"' that cannot be converted to a JsonValue without a mapper");
5959
}
6060

61-
return getParser(mapper).getValue();
61+
final JsonParser parser = getParser(mapper);
62+
parser.next(); // move to first event
63+
return parser.getValue();
6264
}
6365

6466
@Override

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package co.elastic.clients.json;
2121

22+
import co.elastic.clients.util.TriFunction;
2223
import jakarta.json.JsonValue;
2324
import jakarta.json.stream.JsonParser;
2425
import jakarta.json.stream.JsonParser.Event;
@@ -62,7 +63,8 @@ default boolean accepts(Event event) {
6263
*/
6364
default V deserialize(JsonParser parser, JsonpMapper mapper) {
6465
JsonParser.Event event = parser.next();
65-
if (event == JsonParser.Event.VALUE_NULL) {
66+
// JSON null: return null unless the deserializer can handle it
67+
if (event == JsonParser.Event.VALUE_NULL && !accepts(Event.VALUE_NULL)) {
6668
return null;
6769
}
6870
JsonpUtils.ensureAccepts(this, parser, event);
@@ -113,6 +115,15 @@ public T deserialize(JsonParser parser, JsonpMapper mapper, Event event) {
113115
};
114116
}
115117

118+
static <T> JsonpDeserializer<T> of(EnumSet<Event> acceptedEvents, TriFunction<JsonParser, JsonpMapper, JsonParser.Event, T> fn) {
119+
return new JsonpDeserializerBase<T>(acceptedEvents) {
120+
@Override
121+
public T deserialize(JsonParser parser, JsonpMapper mapper, Event event) {
122+
return fn.apply(parser, mapper, event);
123+
}
124+
};
125+
}
126+
116127
static <T> JsonpDeserializer<T> lazy(Supplier<JsonpDeserializer<T>> ctor) {
117128
return new LazyDeserializer<>(ctor);
118129
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ public Integer deserialize(JsonParser parser, JsonpMapper mapper, Event event) {
125125

126126
static final JsonpDeserializer<Boolean> BOOLEAN =
127127
new JsonpDeserializerBase<Boolean>(
128-
EnumSet.of(Event.VALUE_FALSE, Event.VALUE_TRUE, Event.VALUE_STRING)
128+
EnumSet.of(Event.VALUE_FALSE, Event.VALUE_TRUE, Event.VALUE_STRING),
129+
EnumSet.of(Event.VALUE_FALSE, Event.VALUE_TRUE)
129130
) {
130131
@Override
131132
public Boolean deserialize(JsonParser parser, JsonpMapper mapper, Event event) {
@@ -183,7 +184,7 @@ public Double deserialize(JsonParser parser, JsonpMapper mapper, Event event) {
183184
static final JsonpDeserializer<Number> NUMBER =
184185
new JsonpDeserializerBase<Number>(
185186
EnumSet.of(Event.VALUE_NUMBER, Event.VALUE_STRING),
186-
EnumSet.of(Event.VALUE_STRING)
187+
EnumSet.of(Event.VALUE_NUMBER)
187188
) {
188189
@Override
189190
public Number deserialize(JsonParser parser, JsonpMapper mapper, Event event) {

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

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -95,23 +95,6 @@ public static void skipValue(JsonParser parser, Event event) {
9595
}
9696
}
9797

98-
/**
99-
* Throws a {@link JsonParsingException} because some unknown property name was encountered
100-
*/
101-
public static void unknownKey(JsonParser parser, String keyName) {
102-
throw new JsonParsingException("Unknown property '" + keyName + "'", parser.getLocation());
103-
}
104-
105-
public static String ensureSingleVariant(JsonParser parser, String variant1, String variant2) {
106-
if (variant1 != null && variant2 != null) {
107-
throw new JsonParsingException(
108-
"Only one variant can be specified, found '" + variant1 + "' and '" + variant2 + "'",
109-
parser.getLocation()
110-
);
111-
}
112-
return variant2;
113-
}
114-
11598
public static <T> T buildVariant(JsonParser parser, ObjectBuilder<T> builder) {
11699
if (builder == null) {
117100
throw new JsonParsingException("No variant found" , parser.getLocation());

java-client/src/test/java/co/elastic/clients/elasticsearch/end_to_end/RequestTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@
4444
import co.elastic.clients.elasticsearch.model.ModelTestCase;
4545
import co.elastic.clients.json.JsonpMapper;
4646
import co.elastic.clients.json.jsonb.JsonbJsonpMapper;
47-
import co.elastic.clients.transport.endpoints.BooleanResponse;
4847
import co.elastic.clients.transport.ElasticsearchTransport;
48+
import co.elastic.clients.transport.endpoints.BooleanResponse;
4949
import co.elastic.clients.transport.rest_client.RestClientTransport;
5050
import org.apache.http.HttpHost;
5151
import org.apache.http.auth.AuthScope;

java-client/src/test/java/co/elastic/clients/elasticsearch/experiments/ClientTests.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import co.elastic.clients.transport.Endpoint;
2929
import org.junit.Test;
3030

31-
3231
import java.io.IOException;
3332
import java.util.Collections;
3433

java-client/src/test/java/co/elastic/clients/elasticsearch/experiments/api/DateMathTimeUnit.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919

2020
package co.elastic.clients.elasticsearch.experiments.api;
2121

22-
import co.elastic.clients.json.JsonpDeserializer;
2322
import co.elastic.clients.json.JsonEnum;
23+
import co.elastic.clients.json.JsonpDeserializer;
2424

2525
public enum DateMathTimeUnit implements JsonEnum {
2626

java-client/src/test/java/co/elastic/clients/elasticsearch/experiments/api/query2/Query.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@
1919

2020
package co.elastic.clients.elasticsearch.experiments.api.query2;
2121

22+
import co.elastic.clients.elasticsearch.experiments.UnionVariant;
2223
import co.elastic.clients.json.BuildFunctionDeserializer;
24+
import co.elastic.clients.json.JsonEnum;
2325
import co.elastic.clients.json.JsonpDeserializer;
2426
import co.elastic.clients.json.JsonpMapper;
2527
import co.elastic.clients.json.JsonpSerializable;
2628
import co.elastic.clients.json.ObjectDeserializer;
2729
import co.elastic.clients.util.ObjectBuilder;
28-
import co.elastic.clients.json.JsonEnum;
2930
import co.elastic.clients.util.TaggedUnion;
3031
import co.elastic.clients.util.TaggedUnionUtils;
31-
import co.elastic.clients.elasticsearch.experiments.UnionVariant;
3232
import jakarta.json.JsonValue;
3333
import jakarta.json.stream.JsonGenerator;
3434

java-client/src/test/java/co/elastic/clients/elasticsearch/experiments/containers/SomeUnion.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@ interface VariantB {
3333
}
3434
*/
3535

36+
import co.elastic.clients.json.JsonEnum;
3637
import co.elastic.clients.json.JsonpDeserializable;
3738
import co.elastic.clients.json.JsonpDeserializer;
3839
import co.elastic.clients.json.JsonpMapper;
3940
import co.elastic.clients.json.JsonpSerializable;
4041
import co.elastic.clients.json.ObjectBuilderDeserializer;
4142
import co.elastic.clients.json.ObjectDeserializer;
4243
import co.elastic.clients.util.ObjectBuilder;
43-
import co.elastic.clients.json.JsonEnum;
4444
import co.elastic.clients.util.TaggedUnion;
4545
import co.elastic.clients.util.TaggedUnionUtils;
4646
import jakarta.json.stream.JsonGenerator;

java-client/src/test/java/co/elastic/clients/elasticsearch/json/JsonDataTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import co.elastic.clients.json.JsonData;
2323
import co.elastic.clients.json.JsonpMapper;
2424
import co.elastic.clients.json.jsonb.JsonbJsonpMapper;
25+
import jakarta.json.JsonString;
26+
import jakarta.json.JsonValue;
2527
import jakarta.json.stream.JsonGenerator;
2628
import jakarta.json.stream.JsonParser;
2729
import org.junit.Assert;
@@ -73,4 +75,15 @@ public void testSerialize() {
7375

7476
assertEquals(json, sw.toString());
7577
}
78+
79+
@Test
80+
public void testConvert() {
81+
82+
JsonData json = JsonData.of("foo");
83+
84+
final JsonValue value = json.toJson(new JsonbJsonpMapper());
85+
86+
assertEquals(JsonValue.ValueType.STRING, value.getValueType());
87+
assertEquals("foo", ((JsonString)value).getString());
88+
}
7689
}

0 commit comments

Comments
 (0)