Skip to content

Commit 4ac3b33

Browse files
committed
add serializeNull and serializeEmpty config options for Jsonb.Builder
1 parent 29bd8e2 commit 4ac3b33

File tree

6 files changed

+81
-12
lines changed

6 files changed

+81
-12
lines changed
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package org.example.customer;
22

33
import io.avaje.jsonb.Json;
4+
import java.util.List;
45

56
@Json
6-
public record SomeAddressWrapper (Long id, Address address) {
7+
public record SomeAddressWrapper (Long id, Address address, List<String> tags) {
78
}

blackbox-test/src/test/java/org/example/customer/SomeAddressWrapperTest.java

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.junit.jupiter.api.Test;
66

77
import java.io.StringWriter;
8+
import java.util.Collections;
89
import java.util.List;
910

1011
import static org.assertj.core.api.Assertions.assertThat;
@@ -17,10 +18,10 @@ class SomeAddressWrapperTest {
1718
void test_when_null() {
1819

1920
var type = jsonb.type(SomeAddressWrapper.class);
20-
String asJson = type.toJson(new SomeAddressWrapper(43L, null));
21+
String asJson = type.toJson(new SomeAddressWrapper(43L, null, Collections.emptyList()));
2122
assertThat(asJson).isEqualTo("{\"id\":43}");
2223

23-
var myList = List.of( new SomeAddressWrapper(43L, null), new SomeAddressWrapper(44L, null));
24+
var myList = List.of( new SomeAddressWrapper(43L, null, Collections.emptyList()), new SomeAddressWrapper(44L, null, Collections.emptyList()));
2425

2526
String asJsonList = type.list().toJson(myList);
2627
assertThat(asJsonList).isEqualTo("[{\"id\":43},{\"id\":44}]");
@@ -35,8 +36,41 @@ void includeNull() {
3536
writer.serializeEmpty(true);
3637

3738
var type = jsonb.type(SomeAddressWrapper.class);
38-
type.toJson(writer, new SomeAddressWrapper(43L, null));
39+
type.toJson(writer, new SomeAddressWrapper(43L, null, Collections.emptyList()));
3940
writer.close();
40-
assertThat(sw.toString()).isEqualTo("{\"id\":43,\"address\":null}");
41+
assertThat(sw.toString()).isEqualTo("{\"id\":43,\"address\":null,\"tags\":[]}");
42+
}
43+
44+
45+
@Test
46+
void includeNull_viaJsonB() {
47+
48+
Jsonb jsonb = Jsonb.newBuilder().serializeNulls(true).build();
49+
50+
var type = jsonb.type(SomeAddressWrapper.class);
51+
String asJson = type.toJson(new SomeAddressWrapper(43L, null, Collections.emptyList()));
52+
assertThat(asJson).isEqualTo("{\"id\":43,\"address\":null}");
53+
}
54+
55+
56+
@Test
57+
void includeEmpty_viaJsonB() {
58+
59+
Jsonb jsonb = Jsonb.newBuilder().serializeEmpty(true).build();
60+
61+
var type = jsonb.type(SomeAddressWrapper.class);
62+
String asJson = type.toJson(new SomeAddressWrapper(43L, null, Collections.emptyList()));
63+
assertThat(asJson).isEqualTo("{\"id\":43,\"tags\":[]}");
64+
}
65+
66+
67+
@Test
68+
void includeNullAndEmpty_viaJsonB() {
69+
70+
Jsonb jsonb = Jsonb.newBuilder().serializeNulls(true).serializeEmpty(true).build();
71+
72+
var type = jsonb.type(SomeAddressWrapper.class);
73+
String asJson = type.toJson(new SomeAddressWrapper(43L, null, Collections.emptyList()));
74+
assertThat(asJson).isEqualTo("{\"id\":43,\"address\":null,\"tags\":[]}");
4175
}
4276
}

jsonb/src/main/java/io/avaje/jsonb/Jsonb.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,20 @@ static Builder newBuilder() {
110110
*/
111111
interface Builder {
112112

113+
/**
114+
* Set to serialise null values or not.
115+
* <p>
116+
* Default is to not serialise nulls.
117+
*/
118+
Builder serializeNulls(boolean serializeNulls);
119+
120+
/**
121+
* Set to serialise empty collections or not.
122+
* <p>
123+
* Default is to not serialise empty collections.
124+
*/
125+
Builder serializeEmpty(boolean serializeEmpty);
126+
113127
/**
114128
* Set failOnUnknown to true such that an exception is thrown when unknown
115129
* properties are read in the json content.

jsonb/src/main/java/io/avaje/jsonb/core/DJsonb.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ class DJsonb implements Jsonb {
2525
private final Map<Type, DJsonType<?>> typeCache = new ConcurrentHashMap<>();
2626
private final ConcurrentHashMap<ViewKey,JsonView<?>> viewCache = new ConcurrentHashMap<>();
2727

28-
DJsonb(List<JsonAdapter.Factory> factories, boolean failOnUnknown, boolean mathAsString) {
28+
DJsonb(List<JsonAdapter.Factory> factories, boolean serializeNulls, boolean serializeEmpty, boolean failOnUnknown, boolean mathAsString) {
2929
this.builder = new CoreAdapterBuilder(this, factories, mathAsString);
30-
this.io = new JacksonAdapter(failOnUnknown); //TODO: Service load the ioAdapter implementation
30+
this.io = new JacksonAdapter(serializeNulls, serializeEmpty, failOnUnknown); //TODO: Service load the ioAdapter implementation
3131
}
3232

3333
@Override
@@ -159,6 +159,20 @@ static final class DBuilder implements Jsonb.Builder {
159159
private final List<JsonAdapter.Factory> factories = new ArrayList<>();
160160
private boolean failOnUnknown;
161161
private boolean mathTypesAsString;
162+
private boolean serializeNulls;
163+
private boolean serializeEmpty;
164+
165+
@Override
166+
public Builder serializeNulls(boolean serializeNulls) {
167+
this.serializeNulls = serializeNulls;
168+
return this;
169+
}
170+
171+
@Override
172+
public Builder serializeEmpty(boolean serializeEmpty) {
173+
this.serializeEmpty = serializeEmpty;
174+
return this;
175+
}
162176

163177
@Override
164178
public Builder failOnUnknown(boolean failOnUnknown) {
@@ -204,7 +218,7 @@ private void registerComponents() {
204218
@Override
205219
public DJsonb build() {
206220
registerComponents();
207-
return new DJsonb(factories, failOnUnknown, mathTypesAsString);
221+
return new DJsonb(factories, serializeNulls, serializeEmpty, failOnUnknown, mathTypesAsString);
208222
}
209223

210224
static <T> JsonAdapter.Factory newAdapterFactory(Type type, JsonAdapter<T> jsonAdapter) {

jsonb/src/main/java/io/avaje/jsonb/jackson/JacksonAdapter.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@
1616
public class JacksonAdapter implements IOAdapter {
1717

1818
private final JsonFactory jsonFactory;
19+
private final boolean serializeNulls;
20+
private final boolean serializeEmpty;
1921
private final boolean failOnUnknown;
2022

21-
public JacksonAdapter(boolean failOnUnknown) {
23+
public JacksonAdapter(boolean serializeNulls, boolean serializeEmpty, boolean failOnUnknown) {
24+
this.serializeNulls = serializeNulls;
25+
this.serializeEmpty = serializeEmpty;
2226
this.failOnUnknown = failOnUnknown;
2327
this.jsonFactory = new JsonFactory();
2428
}
@@ -67,7 +71,7 @@ public JsonReader reader(InputStream inputStream) {
6771
@Override
6872
public JsonWriter writer(Writer writer) {
6973
try {
70-
return new JacksonWriter(jsonFactory.createGenerator(writer));
74+
return new JacksonWriter(jsonFactory.createGenerator(writer), serializeNulls, serializeEmpty);
7175
} catch (IOException e) {
7276
throw new JsonIoException(e);
7377
}
@@ -77,7 +81,7 @@ public JsonWriter writer(Writer writer) {
7781
@Override
7882
public JsonWriter writer(OutputStream outputStream) {
7983
try {
80-
return new JacksonWriter(jsonFactory.createGenerator(outputStream));
84+
return new JacksonWriter(jsonFactory.createGenerator(outputStream), serializeNulls, serializeEmpty);
8185
} catch (IOException e) {
8286
throw new JsonIoException(e);
8387
}

jsonb/src/main/java/io/avaje/jsonb/jackson/JacksonWriter.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ final class JacksonWriter implements JsonWriter {
2222
private boolean pushedNames;
2323
private int namePos = -1;
2424

25-
JacksonWriter(JsonGenerator generator) {
25+
JacksonWriter(JsonGenerator generator, boolean serializeNulls, boolean serializeEmpty) {
2626
this.generator = generator;
27+
this.serializeNulls = serializeNulls;
28+
this.serializeEmpty = serializeEmpty;
2729
}
2830

2931
@Override

0 commit comments

Comments
 (0)