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
5 changes: 5 additions & 0 deletions json-core/src/main/java/io/avaje/json/JsonWriter.java
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ public interface JsonWriter extends Closeable, Flushable {
*/
boolean serializeEmpty();

/**
* Forces serialization of the next value, regardless of it being null or empty
*/
void forceSerialize();

/**
* Set tp true to output json in pretty format.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,11 @@ public final void serializeEmpty(boolean serializeEmpty) {
delegate.serializeEmpty(serializeEmpty);
}

@Override
public final void forceSerialize() {
delegate.forceSerialize();
}

@Override
public final void pretty(boolean pretty) {
delegate.pretty(pretty);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ final class JsonWriteAdapter implements JsonWriter {
private final BufferRecycler recycler;
private boolean serializeEmpty;
private boolean serializeNulls;
private boolean forceNext;
private String deferredName;
private int namePos = -1;

Expand Down Expand Up @@ -71,6 +72,11 @@ public void serializeEmpty(boolean serializeEmpty) {
this.serializeEmpty = serializeEmpty;
}

@Override
public void forceSerialize() {
this.forceNext = true;
}

@Override
public String path() {
return generator.toString();
Expand Down Expand Up @@ -127,11 +133,12 @@ void writeDeferredName() {
generator.writeName(deferredName);
deferredName = null;
}
forceNext = false;
}

@Override
public void emptyArray() {
if (serializeEmpty) {
if (serializeEmpty || forceNext) {
writeDeferredName();
generator.startArray();
generator.endArray();
Expand All @@ -144,7 +151,7 @@ public void emptyArray() {

@Override
public void nullValue() {
if (serializeNulls) {
if (serializeNulls || forceNext) {
writeDeferredName();
generator.writeNull();
} else if (namePos >= 0) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package io.avaje.json.stream.core;

import static org.assertj.core.api.Assertions.assertThat;

import java.io.IOException;
import java.io.StringWriter;
import java.util.List;

import org.junit.jupiter.api.Test;

import io.avaje.json.JsonAdapter;
import io.avaje.json.JsonWriter;
import io.avaje.json.core.CoreTypes;
import io.avaje.json.stream.JsonStream;

public class ForcedWriteTest {
JsonStream stream = CoreJsonStream.builder().serializeNulls(false).serializeEmpty(false).build();

JsonAdapter<Boolean> booleanAdapter = CoreTypes.create(Boolean.class);
JsonAdapter<List<Integer>> intListAdapter = CoreTypes.createList(CoreTypes.create(Integer.class));

@Test
void forcedWrite_nullObject() throws IOException {
StringWriter sw = new StringWriter();
JsonWriter writer = stream.writer(sw);

writer.beginObject();
writer.name("true");
booleanAdapter.toJson(writer, true);
writer.forceSerialize();
writer.name("forcedNull");
booleanAdapter.toJson(writer, null);
writer.name("skippedNull");
booleanAdapter.toJson(writer, null);
writer.endObject();

writer.close();
String asJson = sw.toString();
sw.close();

assertThat(asJson).isEqualTo("{\"true\":true,\"forcedNull\":null}");
}

@Test
void forcedWrite_emptyList() throws IOException {
StringWriter sw = new StringWriter();
JsonWriter writer = stream.writer(sw);

writer.beginObject();
writer.name("contents");
intListAdapter.toJson(writer, List.of(2, 3));
writer.forceSerialize();
writer.name("forcedEmpty");
intListAdapter.toJson(writer, List.of());
writer.name("skippedEmpty");
intListAdapter.toJson(writer, List.of());
writer.endObject();

writer.close();
String asJson = sw.toString();
sw.close();

assertThat(asJson).isEqualTo("{\"contents\":[2,3],\"forcedEmpty\":[]}");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ final class JacksonWriter implements JsonWriter {
private final JsonGenerator generator;
private boolean serializeEmpty;
private boolean serializeNulls;
private boolean forceNext;
private String deferredName;
private final ArrayDeque<JacksonNames> nameStack = new ArrayDeque<>();
private JacksonNames currentNames;
Expand Down Expand Up @@ -90,6 +91,11 @@ public void serializeEmpty(boolean serializeEmpty) {
this.serializeEmpty = serializeEmpty;
}

@Override
public void forceSerialize() {
this.forceNext = true;
}

@Override
public String path() {
return generator.toString();
Expand Down Expand Up @@ -177,11 +183,12 @@ void writeDeferredName() throws IOException {
generator.writeFieldName(deferredName);
deferredName = null;
}
forceNext = false;
}

@Override
public void emptyArray() {
if (serializeEmpty) {
if (serializeEmpty || forceNext) {
try {
writeDeferredName();
generator.writeStartArray();
Expand All @@ -199,7 +206,7 @@ public void emptyArray() {
@Override
public void nullValue() {
try {
if (serializeNulls) {
if (serializeNulls || forceNext) {
writeDeferredName();
generator.writeNull();
} else if (namePos >= 0) {
Expand Down
Loading