Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
*/


import jakarta.json.bind.annotation.JsonbCreator;
import jakarta.json.bind.annotation.JsonbProperty;
import org.junit.Test;

import jakarta.json.Json;
Expand All @@ -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;

Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -391,4 +447,6 @@ public DoorStatus adaptFromJson(Integer obj) {
}

}


}
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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) {
Expand Down