Skip to content

Commit 7589a9c

Browse files
committed
Optimizations for EnhancedDocument.toJson()
1 parent 98f1cca commit 7589a9c

File tree

2 files changed

+64
-30
lines changed

2 files changed

+64
-30
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "bugfix",
3+
"category": "Amazon DynamoDB Enhanced Client",
4+
"contributor": "",
5+
"description": "Optimizations for DDB EnhancedDocument.toJson()"
6+
}

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

Lines changed: 58 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -46,44 +46,72 @@ public static String stringValue(JsonNode jsonNode) {
4646
}
4747

4848
/**
49-
* Escapes characters for a give given string
49+
* Escapes characters for a given string
5050
*
5151
* @param input Input string
5252
* @return String with escaped characters.
5353
*/
5454
public static String addEscapeCharacters(String input) {
55-
StringBuilder output = new StringBuilder();
56-
for (int i = 0; i < input.length(); i++) {
55+
StringBuilder output = null;
56+
int len = input.length();
57+
58+
for (int i = 0; i < len; i++) {
5759
char ch = input.charAt(i);
58-
switch (ch) {
59-
case '\\':
60-
output.append("\\\\"); // escape backslash with a backslash
61-
break;
62-
case '\n':
63-
output.append("\\n"); // newline character
64-
break;
65-
case '\r':
66-
output.append("\\r"); // carriage return character
67-
break;
68-
case '\t':
69-
output.append("\\t"); // tab character
70-
break;
71-
case '\f':
72-
output.append("\\f"); // form feed
73-
break;
74-
case '\"':
75-
output.append("\\\""); // double-quote character
76-
break;
77-
default:
78-
if (Character.isISOControl(ch)) {
79-
output.append(String.format("\\u%04X", (int) ch));
80-
} else {
81-
output.append(ch);
82-
}
83-
break;
60+
if (needsEscaping(ch)) {
61+
if (output == null) {
62+
output = initializeStringBuilder(input, i);
63+
}
64+
appendEscapeChar(output, ch);
65+
} else if (output != null) {
66+
output.append(ch);
8467
}
8568
}
86-
return output.toString();
69+
70+
return output == null ? input : output.toString();
71+
}
72+
73+
private static boolean needsEscaping(char ch) {
74+
return Character.isISOControl(ch) || ch == '"' || ch == '\\';
75+
}
76+
77+
/**
78+
* Initialize StringBuilder with the unescaped portion of the input.
79+
*/
80+
private static StringBuilder initializeStringBuilder(String input, int position) {
81+
// Arbitrary buffer of 16
82+
StringBuilder builder = new StringBuilder(input.length() + 16);
83+
builder.append(input, 0, position);
84+
return builder;
85+
}
86+
87+
private static void appendEscapeChar(StringBuilder output, char ch) {
88+
switch (ch) {
89+
case '\\':
90+
output.append("\\\\"); // escape backslash with a backslash
91+
break;
92+
case '\n':
93+
output.append("\\n"); // newline character
94+
break;
95+
case '\r':
96+
output.append("\\r"); // carriage return character
97+
break;
98+
case '\t':
99+
output.append("\\t"); // tab character
100+
break;
101+
case '\f':
102+
output.append("\\f"); // form feed
103+
break;
104+
case '\"':
105+
output.append("\\\""); // double-quote character
106+
break;
107+
default:
108+
if (Character.isISOControl(ch)) {
109+
output.append(String.format("\\u%04X", (int) ch));
110+
} else {
111+
output.append(ch);
112+
}
113+
break;
114+
}
87115
}
88116

89117
private static String mapToString(JsonNode jsonNode) {

0 commit comments

Comments
 (0)