@@ -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