11package software .amazon .awssdk .enhanced .dynamodb .internal .document ;
22
3- import java .nio .charset .StandardCharsets ;
3+ import java .io .IOException ;
4+ import java .io .StringWriter ;
45import java .util .Map ;
56import software .amazon .awssdk .annotations .SdkInternalApi ;
67import software .amazon .awssdk .core .SdkBytes ;
7- import software .amazon .awssdk .protocols .json .SdkJsonGenerator ;
88import software .amazon .awssdk .services .dynamodb .model .AttributeValue ;
99import software .amazon .awssdk .thirdparty .jackson .core .JsonFactory ;
10+ import software .amazon .awssdk .thirdparty .jackson .core .JsonGenerator ;
1011
1112@ SdkInternalApi
1213public 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 ;
0 commit comments