Skip to content

Commit 241d120

Browse files
committed
refactor to use jackson directly
1 parent 3c63623 commit 241d120

2 files changed

Lines changed: 32 additions & 44 deletions

File tree

services-custom/dynamodb-enhanced/src/main/java/software/amazon/awssdk/enhanced/dynamodb/internal/document/StrategyJsonSerializer.java

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package software.amazon.awssdk.enhanced.dynamodb.internal.document;
22

3-
import java.nio.charset.StandardCharsets;
3+
import java.io.IOException;
4+
import java.io.StringWriter;
45
import java.util.Map;
56
import software.amazon.awssdk.annotations.SdkInternalApi;
67
import software.amazon.awssdk.core.SdkBytes;
7-
import software.amazon.awssdk.protocols.json.SdkJsonGenerator;
88
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
99
import software.amazon.awssdk.thirdparty.jackson.core.JsonFactory;
10+
import software.amazon.awssdk.thirdparty.jackson.core.JsonGenerator;
1011

1112
@SdkInternalApi
1213
public final class StrategyJsonSerializer {
@@ -17,37 +18,37 @@ private StrategyJsonSerializer() {
1718
private enum JsonSerializationStrategy {
1819
NULL {
1920
@Override
20-
public void serialize(SdkJsonGenerator generator, AttributeValue av) {
21+
public void serialize(JsonGenerator generator, AttributeValue av) throws IOException {
2122
generator.writeNull();
2223
}
2324
},
2425
STRING {
2526
@Override
26-
public void serialize(SdkJsonGenerator generator, AttributeValue av) {
27-
generator.writeValue(av.s());
27+
public void serialize(JsonGenerator generator, AttributeValue av) throws IOException {
28+
generator.writeString(av.s());
2829
}
2930
},
3031
NUMBER {
3132
@Override
32-
public void serialize(SdkJsonGenerator generator, AttributeValue av) {
33+
public void serialize(JsonGenerator generator, AttributeValue av) throws IOException {
3334
generator.writeNumber(av.n());
3435
}
3536
},
3637
BOOLEAN {
3738
@Override
38-
public void serialize(SdkJsonGenerator generator, AttributeValue av) {
39-
generator.writeValue(av.bool());
39+
public void serialize(JsonGenerator generator, AttributeValue av) throws IOException {
40+
generator.writeBoolean(av.bool());
4041
}
4142
},
4243
BYTES {
4344
@Override
44-
public void serialize(SdkJsonGenerator generator, AttributeValue av) {
45-
generator.writeValue(av.b().asByteBuffer());
45+
public void serialize(JsonGenerator generator, AttributeValue av) throws IOException {
46+
generator.writeBinary(av.b().asByteArray());
4647
}
4748
},
4849
LIST {
4950
@Override
50-
public void serialize(SdkJsonGenerator generator, AttributeValue av) {
51+
public void serialize(JsonGenerator generator, AttributeValue av) throws IOException {
5152
generator.writeStartArray();
5253
for (AttributeValue item : av.l()) {
5354
serializeAttributeValue(generator, item);
@@ -57,7 +58,7 @@ public void serialize(SdkJsonGenerator generator, AttributeValue av) {
5758
},
5859
MAP {
5960
@Override
60-
public void serialize(SdkJsonGenerator generator, AttributeValue av) {
61+
public void serialize(JsonGenerator generator, AttributeValue av) throws IOException {
6162
generator.writeStartObject();
6263
for (Map.Entry<String, AttributeValue> entry : av.m().entrySet()) {
6364
generator.writeFieldName(entry.getKey());
@@ -68,17 +69,17 @@ public void serialize(SdkJsonGenerator generator, AttributeValue av) {
6869
},
6970
STRING_SET {
7071
@Override
71-
public void serialize(SdkJsonGenerator generator, AttributeValue av) {
72+
public void serialize(JsonGenerator generator, AttributeValue av) throws IOException {
7273
generator.writeStartArray();
7374
for (String s : av.ss()) {
74-
generator.writeValue(s);
75+
generator.writeString(s);
7576
}
7677
generator.writeEndArray();
7778
}
7879
},
7980
NUMBER_SET {
8081
@Override
81-
public void serialize(SdkJsonGenerator generator, AttributeValue av) {
82+
public void serialize(JsonGenerator generator, AttributeValue av) throws IOException {
8283
generator.writeStartArray();
8384
for (String n : av.ns()) {
8485
generator.writeNumber(n);
@@ -88,36 +89,38 @@ public void serialize(SdkJsonGenerator generator, AttributeValue av) {
8889
},
8990
BYTES_SET {
9091
@Override
91-
public void serialize(SdkJsonGenerator generator, AttributeValue av) {
92+
public void serialize(JsonGenerator generator, AttributeValue av) throws IOException {
9293
generator.writeStartArray();
9394
for (SdkBytes b : av.bs()) {
94-
generator.writeValue(b.asByteBuffer());
95+
generator.writeBinary(b.asByteArray());
9596
}
9697
generator.writeEndArray();
9798
}
9899
};
99100

100-
public abstract void serialize(SdkJsonGenerator generator, AttributeValue av);
101+
public abstract void serialize(JsonGenerator generator, AttributeValue av) throws IOException;
101102
}
102103

103104
public static String serializeAttributeValueMap(Map<String, AttributeValue> map) {
104-
SdkJsonGenerator jsonGen = new SdkJsonGenerator(new JsonFactory(), "application/json");
105-
106-
jsonGen.writeStartObject();
107-
for (Map.Entry<String, AttributeValue> entry : map.entrySet()) {
108-
jsonGen.writeFieldName(entry.getKey());
109-
serializeAttributeValue(jsonGen, entry.getValue());
105+
StringWriter writer = new StringWriter();
106+
try (JsonGenerator generator = new JsonFactory().createGenerator(writer)) {
107+
generator.writeStartObject();
108+
for (Map.Entry<String, AttributeValue> entry : map.entrySet()) {
109+
generator.writeFieldName(entry.getKey());
110+
serializeAttributeValue(generator, entry.getValue());
111+
}
112+
generator.writeEndObject();
113+
} catch (IOException e) {
114+
throw new IllegalStateException("Failed to serialize AttributeValue map to JSON", e);
110115
}
111-
jsonGen.writeEndObject();
112-
113-
return new String(jsonGen.getBytes(), StandardCharsets.UTF_8);
116+
return writer.toString();
114117
}
115118

116-
117-
public static void serializeAttributeValue(SdkJsonGenerator generator, AttributeValue av) {
119+
private static void serializeAttributeValue(JsonGenerator generator, AttributeValue av) throws IOException {
118120
JsonSerializationStrategy strategy = getStrategy(av);
119121
strategy.serialize(generator, av);
120122
}
123+
121124
private static JsonSerializationStrategy getStrategy(AttributeValue av) {
122125
if (av.nul() != null && av.nul()) return JsonSerializationStrategy.NULL;
123126
if (av.s() != null) return JsonSerializationStrategy.STRING;

services-custom/dynamodb-enhanced/src/test/java/software/amazon/awssdk/enhanced/dynamodb/document/DocumentTableSchemaTest.java

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -247,20 +247,5 @@ void validate_toJson_WithNonAsciiEmoji() {
247247

248248
String json = doc.toJson();
249249
assertThat(json).isEqualTo("{\"emoji\":\"Hello 😀 World\"}");
250-
251-
252-
/*
253-
BEHAVIOR CHANGE: the new toJson() implementation does not result in the same output.
254-
This is because SdkJsonGenerator uses ByteArrayOutputStream which writes raw UTF-8 bytes.
255-
Jackson's UTF-8 generator automatically escapes non-ASCII characters as \\uXXXX" sequences
256-
when writing to byte streams.
257-
258-
The previous implementation used addEscapeCharacters from JsonStringFormatHelper which only
259-
escapes control characters, quotes, and backslashes, but leaving emojis as literal UTF-8.
260-
261-
org.opentest4j.AssertionFailedError:
262-
expected: "{"emoji":"Hello 😀 World"}"
263-
but was: "{"emoji":"Hello \uD83D\uDE00 World"}"
264-
*/
265250
}
266251
}

0 commit comments

Comments
 (0)