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 @@ -82,4 +82,19 @@ public boolean equals(Object obj) {
&& Objects.equals(stringyString, other.stringyString)
&& Objects.equals(publicOp, other.publicOp);
}

@Override
public String toString() {
return "Optionals[doubleOp="
+ doubleOp
+ ", intOp="
+ intOp
+ ", longOp="
+ longOp
+ ", stringyString="
+ stringyString
+ ", publicOp="
+ publicOp
+ "]";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import static org.assertj.core.api.Assertions.assertThat;

import java.util.Optional;
import java.util.OptionalInt;

import org.jspecify.annotations.NonNull;
import org.junit.jupiter.api.Test;

import io.avaje.jsonb.Jsonb;
Expand All @@ -15,6 +15,7 @@ class OptionalsTest {
"{\"stringyString\":\"StringyMcStringFace\",\"intOp\":21,\"doubleOp\":6.9,\"longOp\":420}";

Jsonb jsonb = Jsonb.builder().serializeEmpty(false).build();
Jsonb jsonbNull = Jsonb.builder().serializeNulls(true).build();

@Test
void anyToJson() {
Expand All @@ -25,7 +26,7 @@ void anyToJson() {
}

@Test
void nullJson() {
void emptyJson() {
final var optionals = new Optionals();

final var optionalsType = jsonb.type(Optionals.class);
Expand All @@ -36,6 +37,18 @@ void nullJson() {
assertThat(from2).isEqualTo(optionals);
}

@Test
void nullJson() {
final var optionals = new Optionals();

final var optionalsType = jsonbNull.type(Optionals.class);
final String asJson = optionalsType.toJson(optionals);
assertThat(asJson).isEqualTo("{\"stringyString\":null,\"intOp\":null,\"doubleOp\":null,\"longOp\":null,\"publicOp\":null}");

final Optionals from2 = optionalsType.fromJson(asJson);
assertThat(from2).isEqualTo(optionals);
}

@Test
void toFromJson() {

Expand All @@ -48,7 +61,7 @@ void toFromJson() {
assertThat(from2).isEqualTo(optionals);
}

private Optionals optionals() {
private @NonNull Optionals optionals() {
final var optionals = new Optionals();

optionals.setStringyString("StringyMcStringFace");
Expand Down
50 changes: 39 additions & 11 deletions jsonb/src/main/java/io/avaje/jsonb/core/OptionalAdapters.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ private OptionalAdapters() {}
static final AdapterFactory FACTORY = (type, jsonb) -> {
if (Types.isGenericTypeOf(type, Optional.class)) {
final Type[] args = Types.typeArguments(type);
return new OptionalAdapter<>(jsonb, args[0]).nullSafe();
return new OptionalAdapter<>(jsonb, args[0]);
} else if (type == OptionalInt.class) {
return new OptionalIntAdapter().nullSafe();
return new OptionalIntAdapter();
} else if (type == OptionalDouble.class) {
return new OptionalDoubleAdapter().nullSafe();
return new OptionalDoubleAdapter();
} else if (type == OptionalLong.class) {
return new OptionalLongAdapter().nullSafe();
return new OptionalLongAdapter();
}
return null;
};
Expand All @@ -42,7 +42,11 @@ static final class OptionalAdapter<T> implements JsonAdapter<Optional<T>> {

@Override
public void toJson(JsonWriter writer, Optional<T> value) {
delegate.toJson(writer, value.orElse(null));
if (value == null) {
writer.nullValue();
} else {
delegate.toJson(writer, value.orElse(null));
}
}

@Override
Expand All @@ -69,12 +73,20 @@ public String toString() {
static final class OptionalIntAdapter implements JsonAdapter<OptionalInt> {
@Override
public OptionalInt fromJson(JsonReader reader) {
return OptionalInt.of(reader.readInt());
if (reader.isNullValue()) {
return OptionalInt.empty();
} else {
return OptionalInt.of(reader.readInt());
}
}

@Override
public void toJson(JsonWriter writer, OptionalInt value) {
value.ifPresentOrElse(writer::value, writer::nullValue);
if (value == null) {
writer.nullValue();
} else {
value.ifPresentOrElse(writer::value, writer::nullValue);
}
}

@Override
Expand All @@ -86,12 +98,20 @@ public String toString() {
static final class OptionalDoubleAdapter implements JsonAdapter<OptionalDouble> {
@Override
public OptionalDouble fromJson(JsonReader reader) {
return OptionalDouble.of(reader.readDouble());
if (reader.isNullValue()) {
return OptionalDouble.empty();
} else {
return OptionalDouble.of(reader.readDouble());
}
}

@Override
public void toJson(JsonWriter writer, OptionalDouble value) {
value.ifPresentOrElse(writer::value, writer::nullValue);
if (value == null) {
writer.nullValue();
} else {
value.ifPresentOrElse(writer::value, writer::nullValue);
}
}

@Override
Expand All @@ -103,12 +123,20 @@ public String toString() {
static final class OptionalLongAdapter implements JsonAdapter<OptionalLong> {
@Override
public OptionalLong fromJson(JsonReader reader) {
return OptionalLong.of(reader.readLong());
if (reader.isNullValue()) {
return OptionalLong.empty();
} else {
return OptionalLong.of(reader.readLong());
}
}

@Override
public void toJson(JsonWriter writer, OptionalLong value) {
value.ifPresentOrElse(writer::value, writer::nullValue);
if (value == null) {
writer.nullValue();
} else {
value.ifPresentOrElse(writer::value, writer::nullValue);
}
}

@Override
Expand Down
Loading