Skip to content

Commit d281a17

Browse files
committed
Fix serialization of Documents with null map values
1 parent f65b936 commit d281a17

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

codecs/json-codec/src/main/java/software/amazon/smithy/java/json/JsonDocuments.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,13 @@ public ShapeDeserializer createDeserializer() {
262262
public void serializeContents(ShapeSerializer serializer) {
263263
serializer.writeMap(PreludeSchemas.DOCUMENT, values, values.size(), (stringMap, mapSerializer) -> {
264264
for (var e : stringMap.entrySet()) {
265-
mapSerializer.writeEntry(STRING_MAP_KEY, e.getKey(), e.getValue(), Document::serializeContents);
265+
mapSerializer.writeEntry(STRING_MAP_KEY, e.getKey(), e.getValue(), (document, ser) -> {
266+
if (document == null) {
267+
ser.writeNull(PreludeSchemas.DOCUMENT);
268+
} else {
269+
document.serializeContents(ser);
270+
}
271+
});
266272
}
267273
});
268274
}

codecs/json-codec/src/test/java/software/amazon/smithy/java/json/JsonDocumentTest.java

+29
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import static org.hamcrest.Matchers.is;
1515
import static org.hamcrest.Matchers.not;
1616
import static org.hamcrest.Matchers.nullValue;
17+
import static org.junit.jupiter.api.Assertions.assertEquals;
18+
import static org.junit.jupiter.api.Assertions.assertNull;
1719

1820
import java.io.ByteArrayOutputStream;
1921
import java.math.BigDecimal;
@@ -185,6 +187,33 @@ public void nullAndMissingMapMembersReturnsNull() {
185187
assertThat(document.getMember("d"), nullValue());
186188
}
187189

190+
@Test
191+
public void nullMapMemberRoundtrip() {
192+
var codec = JsonCodec.builder().build();
193+
var doc = codec.createDeserializer("{\"a\":null}".getBytes(StandardCharsets.UTF_8)).readDocument();
194+
var roundtrip = codec.createDeserializer(codec.serialize(doc)).readDocument();
195+
196+
assertEquals(doc, roundtrip);
197+
}
198+
199+
@Test
200+
public void nullListMemberRoundtrip() {
201+
var codec = JsonCodec.builder().build();
202+
var doc = codec.createDeserializer("[null]".getBytes(StandardCharsets.UTF_8)).readDocument();
203+
var roundtrip = codec.createDeserializer(codec.serialize(doc)).readDocument();
204+
205+
assertEquals(doc, roundtrip);
206+
}
207+
208+
@Test
209+
public void nullDocument() {
210+
var codec = JsonCodec.builder().build();
211+
var de = codec.createDeserializer("null".getBytes(StandardCharsets.UTF_8));
212+
213+
var document = de.readDocument();
214+
assertNull(document);
215+
}
216+
188217
@ParameterizedTest
189218
@MethodSource("failToConvertSource")
190219
public void failToConvert(String json, Consumer<Document> consumer) {

0 commit comments

Comments
 (0)