diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java index f5cb9721..4ee1af5a 100644 --- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java +++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/AdapterTest.java @@ -19,6 +19,8 @@ */ +import jakarta.json.bind.annotation.JsonbCreator; +import jakarta.json.bind.annotation.JsonbProperty; import org.junit.Test; import jakarta.json.Json; @@ -39,6 +41,7 @@ import static org.hamcrest.CoreMatchers.endsWith; import static org.hamcrest.CoreMatchers.startsWith; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -136,6 +139,39 @@ public void adaptJson() throws Exception { } } + @Test + public void adaptJsonWithCreator() throws Exception { + try (final Jsonb jsonb = JsonbBuilder.create()) { + final String json = "{\"value\":\"orange\", \"dummy\":\"2\"}"; + + final Foo3 foo3 = jsonb.fromJson(json, Foo3.class); + assertEquals("orange", foo3.value); + assertEquals(2, foo3.dummy.value); + } + } + + @Test + public void adaptJsonWithCreatorNull() throws Exception { + try (final Jsonb jsonb = JsonbBuilder.create()) { + final String json = "{\"value\":\"orange\"}"; + + final Foo3 foo3 = jsonb.fromJson(json, Foo3.class); + assertEquals("orange", foo3.value); + assertNull( foo3.dummy); + } + } + + @Test + public void adaptJsonWithFieldNull() throws Exception { + try (final Jsonb jsonb = JsonbBuilder.create()) { + final String json = "{\"value\":\"orange\"}"; + + final Foo4 foo4 = jsonb.fromJson(json, Foo4.class); + assertEquals("orange", foo4.value); + assertNull( foo4.dummy); + } + } + @Test public void notYetPloymorphism() { // we run it since it checked list/item conversion final Bar bar = new Bar(); @@ -239,6 +275,26 @@ public void setValue(final Bar value) { } } + public static class Foo3 { + public String value; + + @JsonbTypeAdapter(DummyAdapter.class) + public Dummy dummy; + + @JsonbCreator + public Foo3(@JsonbProperty("dummy") @JsonbTypeAdapter(DummyAdapter.class) final Dummy dummy, + @JsonbProperty("value") final String value) { + this.dummy = dummy; + this.value = value; + } + } + + public static class Foo4 { + public String value; + + @JsonbTypeAdapter(DummyAdapter.class) + public Dummy dummy; + } public static class Foo2 { @JsonbTypeAdapter(Dummy2Adapter.class) @@ -391,4 +447,6 @@ public DoorStatus adaptFromJson(Integer obj) { } } + + } diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java index 61dd5c95..2a0a1f4c 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/MappingParserImpl.java @@ -498,6 +498,10 @@ private Object convertTo(final Adapter converter, final JsonValue jsonValue, fin return converter.to(jsonValue); } + if (jsonValue == null) { + return getNullValue(targetType); + } + if (JsonValue.ValueType.OBJECT == valueType) { if (JsonObject.class == key.getTo() || JsonStructure.class == key.getTo()) { return converter.to(jsonValue.asJsonObject()); @@ -598,20 +602,7 @@ private Object toObject(final Object baseInstance, final JsonValue jsonValue, final Type type, final Adapter itemConverter, final JsonPointerTracker jsonPointer, final Type rootType) { if (jsonValue == null) { - if (OptionalInt.class == type) { - return OptionalInt.empty(); - } - if (OptionalDouble.class == type) { - return OptionalDouble.empty(); - } - if (OptionalLong.class == type) { - return OptionalLong.empty(); - } - if (type instanceof ParameterizedType && Optional.class == ((ParameterizedType)type).getRawType()) { - return Optional.empty(); - } - - return null; + return getNullValue(type); } JsonValue.ValueType valueType = jsonValue.getValueType(); @@ -752,6 +743,23 @@ private Object toObject(final Object baseInstance, final JsonValue jsonValue, throw new MapperException("Unable to parse " + description + " to " + type + ": " + snippet); } + private static Object getNullValue(final Type type) { + if (OptionalInt.class == type) { + return OptionalInt.empty(); + } + if (OptionalDouble.class == type) { + return OptionalDouble.empty(); + } + if (OptionalLong.class == type) { + return OptionalLong.empty(); + } + if (type instanceof ParameterizedType && Optional.class == ((ParameterizedType) type).getRawType()) { + return Optional.empty(); + } + + return null; + } + private Object buildArray(final Type type, final JsonArray jsonArray, final Adapter itemConverter, final ObjectConverter.Reader objectConverter, final JsonPointerTracker jsonPointer, final Type rootType) {