Issue 342: Custom De-Serialization Bug (#482)
Signed-off-by: rmartinc <rmartinc@redhat.com>
diff --git a/src/main/java/org/eclipse/yasson/internal/JsonbRiParser.java b/src/main/java/org/eclipse/yasson/internal/JsonbRiParser.java
index c2a34b1..27fffb4 100644
--- a/src/main/java/org/eclipse/yasson/internal/JsonbRiParser.java
+++ b/src/main/java/org/eclipse/yasson/internal/JsonbRiParser.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
@@ -271,7 +271,17 @@
@Override
public JsonValue getValue() {
- return jsonParser.getValue();
+ if (level.isEmpty() || getLastEvent() == null) {
+ return jsonParser.getValue();
+ }
+ switch (getLastEvent()) {
+ case START_ARRAY:
+ return getArray();
+ case START_OBJECT:
+ return getObject();
+ default:
+ return jsonParser.getValue();
+ }
}
@Override
diff --git a/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java b/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java
index 2093e87..9eeb938 100644
--- a/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java
+++ b/src/test/java/org/eclipse/yasson/serializers/SerializersTest.java
@@ -485,6 +485,25 @@
}
}
+ @Test
+ public void testDeserializeArrayWithAdvancingParserAfterObjectEndUsingValue() {
+ String json = "[{\"stringProperty\":\"Property 1 value\"},{\"stringProperty\":\"Property 2 value\"}]";
+ Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withDeserializers(new SimplePojoValueDeserializer()));
+ SimplePojo[] result = jsonb.fromJson(json, SimplePojo[].class);
+ assertEquals(2, result.length);
+ }
+
+ public class SimplePojoValueDeserializer implements JsonbDeserializer<SimplePojo> {
+ @Override
+ public SimplePojo deserialize(JsonParser parser, DeserializationContext ctx, Type rtType) {
+ //parser.getValue advances the parser to END_OBJECT in case of object.
+ JsonObject json = parser.getValue().asJsonObject();
+ SimplePojo simplePojo = new SimplePojo();
+ simplePojo.setStringProperty(json.getString("stringProperty"));
+ return simplePojo;
+ }
+ }
+
public class SimplePojo {
private String stringProperty;