11package software .amazon .awssdk .enhanced .dynamodb .internal .document ;
22
3- import java .io .IOException ;
4- import java .io .StringWriter ;
5- import java .io .UncheckedIOException ;
3+ import java .nio .charset .StandardCharsets ;
64import java .util .Map ;
75import software .amazon .awssdk .annotations .SdkInternalApi ;
86import software .amazon .awssdk .core .SdkBytes ;
9- import software .amazon .awssdk .services . dynamodb . model . AttributeValue ;
7+ import software .amazon .awssdk .protocols . json . SdkJsonGenerator ;
108import software .amazon .awssdk .thirdparty .jackson .core .JsonFactory ;
11- import software .amazon .awssdk .thirdparty . jackson . core . JsonGenerator ;
9+ import software .amazon .awssdk .services . dynamodb . model . AttributeValue ;
1210
1311@ SdkInternalApi
1412public final class StrategyJsonSerializer {
1513
16- private StrategyJsonSerializer () {
14+ private enum JsonSerializationStrategy {
15+ NULL ,
16+ STRING ,
17+ NUMBER ,
18+ BOOLEAN ,
19+ BYTES ,
20+ LIST ,
21+ MAP ,
22+ STRING_SET ,
23+ NUMBER_SET ,
24+ BYTES_SET
1725 }
1826
1927 public static String serializeAttributeValueMap (Map <String , AttributeValue > map ) {
20- StringWriter writer = new StringWriter ();
21- try (JsonGenerator generator = new JsonFactory ().createGenerator (writer )) {
22- generator .writeStartObject ();
23- for (Map .Entry <String , AttributeValue > entry : map .entrySet ()) {
24- generator .writeFieldName (entry .getKey ());
25- serializeAttributeValue (generator , entry .getValue ());
26- }
27- generator .writeEndObject ();
28- } catch (IOException e ) {
29- throw new UncheckedIOException (e );
30- }
31- return writer .toString ();
32- }
28+ SdkJsonGenerator jsonGen = new SdkJsonGenerator (new JsonFactory (), "application/json" );
3329
34- private static void serializeAttributeValue (JsonGenerator generator , AttributeValue av ) throws IOException {
35- if (av .nul () != null && av .nul ()) {
36- generator .writeNull ();
37- } else if (av .s () != null ) {
38- generator .writeString (av .s ());
39- } else if (av .n () != null ) {
40- generator .writeNumber (av .n ());
41- } else if (av .bool () != null ) {
42- generator .writeBoolean (av .bool ());
43- } else if (av .b () != null ) {
44- generator .writeBinary (av .b ().asByteArray ());
45- } else if (av .hasL ()) {
46- serializeList (generator , av );
47- } else if (av .hasM ()) {
48- serializeMap (generator , av );
49- } else if (av .hasSs ()) {
50- serializeStringSet (generator , av );
51- } else if (av .hasNs ()) {
52- serializeNumberSet (generator , av );
53- } else if (av .hasBs ()) {
54- serializeBytesSet (generator , av );
55- } else {
56- throw new IllegalStateException ("Unknown AttributeValue type: " + av );
57- }
58- }
30+ jsonGen .writeStartObject ();
31+ map .forEach ((key , value ) -> {
32+ jsonGen .writeFieldName (key );
33+ serializeAttributeValue (jsonGen , value );
34+ });
35+ jsonGen .writeEndObject ();
5936
60- private static void serializeList (JsonGenerator generator , AttributeValue av ) throws IOException {
61- generator .writeStartArray ();
62- for (AttributeValue item : av .l ()) {
63- serializeAttributeValue (generator , item );
64- }
65- generator .writeEndArray ();
37+ return new String (jsonGen .getBytes (), StandardCharsets .UTF_8 );
6638 }
6739
68- private static void serializeMap (JsonGenerator generator , AttributeValue av ) throws IOException {
69- generator .writeStartObject ();
70- for (Map .Entry <String , AttributeValue > entry : av .m ().entrySet ()) {
71- generator .writeFieldName (entry .getKey ());
72- serializeAttributeValue (generator , entry .getValue ());
73- }
74- generator .writeEndObject ();
75- }
76-
77- private static void serializeStringSet (JsonGenerator generator , AttributeValue av ) throws IOException {
78- generator .writeStartArray ();
79- for (String s : av .ss ()) {
80- generator .writeString (s );
81- }
82- generator .writeEndArray ();
83- }
40+ public static void serializeAttributeValue (SdkJsonGenerator generator , AttributeValue av ) {
41+ JsonSerializationStrategy strategy = getStrategy (av );
8442
85- private static void serializeNumberSet (JsonGenerator generator , AttributeValue av ) throws IOException {
86- generator .writeStartArray ();
87- for (String n : av .ns ()) {
88- generator .writeNumber (n );
43+ switch (strategy ) {
44+ case NULL :
45+ generator .writeNull ();
46+ break ;
47+ case STRING :
48+ generator .writeValue (av .s ());
49+ break ;
50+ case NUMBER :
51+ generator .writeNumber (av .n ());
52+ break ;
53+ case BOOLEAN :
54+ generator .writeValue (av .bool ());
55+ break ;
56+ case BYTES :
57+ generator .writeValue (av .b ().asByteBuffer ());
58+ break ;
59+ case LIST :
60+ generator .writeStartArray ();
61+ for (AttributeValue item : av .l ()) {
62+ serializeAttributeValue (generator , item );
63+ }
64+ generator .writeEndArray ();
65+ break ;
66+ case MAP :
67+ generator .writeStartObject ();
68+ for (Map .Entry <String , AttributeValue > entry : av .m ().entrySet ()) {
69+ generator .writeFieldName (entry .getKey ());
70+ serializeAttributeValue (generator , entry .getValue ());
71+ }
72+ generator .writeEndObject ();
73+ break ;
74+ case STRING_SET :
75+ generator .writeStartArray ();
76+ for (String s : av .ss ()) {
77+ generator .writeValue (s );
78+ }
79+ generator .writeEndArray ();
80+ break ;
81+ case NUMBER_SET :
82+ generator .writeStartArray ();
83+ for (String n : av .ns ()) {
84+ generator .writeNumber (n );
85+ }
86+ generator .writeEndArray ();
87+ break ;
88+ case BYTES_SET :
89+ generator .writeStartArray ();
90+ for (SdkBytes b : av .bs ()) {
91+ generator .writeValue (b .asByteBuffer ());
92+ }
93+ generator .writeEndArray ();
94+ break ;
95+ default :
96+ throw new IllegalStateException ("Unsupported strategy: " + strategy );
8997 }
90- generator .writeEndArray ();
9198 }
9299
93- private static void serializeBytesSet (JsonGenerator generator , AttributeValue av ) throws IOException {
94- generator .writeStartArray ();
95- for (SdkBytes b : av .bs ()) {
96- generator .writeBinary (b .asByteArray ());
97- }
98- generator .writeEndArray ();
100+ private static JsonSerializationStrategy getStrategy (AttributeValue av ) {
101+ if (av .nul () != null && av .nul ()) return JsonSerializationStrategy .NULL ;
102+ if (av .s () != null ) return JsonSerializationStrategy .STRING ;
103+ if (av .n () != null ) return JsonSerializationStrategy .NUMBER ;
104+ if (av .bool () != null ) return JsonSerializationStrategy .BOOLEAN ;
105+ if (av .b () != null ) return JsonSerializationStrategy .BYTES ;
106+ if (av .hasL ()) return JsonSerializationStrategy .LIST ;
107+ if (av .hasM ()) return JsonSerializationStrategy .MAP ;
108+ if (av .hasSs ()) return JsonSerializationStrategy .STRING_SET ;
109+ if (av .hasNs ()) return JsonSerializationStrategy .NUMBER_SET ;
110+ if (av .hasBs ()) return JsonSerializationStrategy .BYTES_SET ;
111+ throw new IllegalStateException ("Unknown AttributeValue type: " + av );
99112 }
100- }
113+ }
0 commit comments