@@ -47,42 +47,47 @@ const char *JSON::tk_name[TK_MAX] = {
4747 " EOF" ,
4848};
4949
50- String JSON::_make_indent (const String &p_indent, int p_size) {
51- return p_indent.repeat (p_size);
50+ void JSON::_add_indent (String &r_result, const String &p_indent, int p_size) {
51+ for (int i = 0 ; i < p_size; i++) {
52+ r_result += p_indent;
53+ }
5254}
5355
54- String JSON::_stringify (const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, HashSet<const void *> &p_markers, bool p_full_precision) {
55- ERR_FAIL_COND_V_MSG (p_cur_indent > Variant::MAX_RECURSION_DEPTH, " ..." , " JSON structure is too deep. Bailing." );
56-
57- String colon = " :" ;
58- String end_statement = " " ;
59-
60- if (!p_indent.is_empty ()) {
61- colon += " " ;
62- end_statement += " \n " ;
56+ void JSON::_stringify (String &r_result, const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, HashSet<const void *> &p_markers, bool p_full_precision) {
57+ if (p_cur_indent > Variant::MAX_RECURSION_DEPTH) {
58+ r_result += " ..." ;
59+ ERR_FAIL_MSG (" JSON structure is too deep. Bailing." );
6360 }
6461
62+ const char *colon = p_indent.is_empty () ? " :" : " : " ;
63+ const char *end_statement = p_indent.is_empty () ? " " : " \n " ;
64+
6565 switch (p_var.get_type ()) {
6666 case Variant::NIL:
67- return " null" ;
67+ r_result += " null" ;
68+ return ;
6869 case Variant::BOOL:
69- return p_var.operator bool () ? " true" : " false" ;
70+ r_result += p_var.operator bool () ? " true" : " false" ;
71+ return ;
7072 case Variant::INT:
71- return itos (p_var);
73+ r_result += itos (p_var);
74+ return ;
7275 case Variant::FLOAT: {
7376 double num = p_var;
7477
7578 // Only for exactly 0. If we have approximately 0 let the user decide how much
7679 // precision they want.
7780 if (num == double (0 )) {
78- return String (" 0.0" );
81+ r_result += " 0.0" ;
82+ return ;
7983 }
8084
8185 double magnitude = std::log10 (Math::abs (num));
8286 int total_digits = p_full_precision ? 17 : 14 ;
8387 int precision = MAX (1 , total_digits - (int )Math::floor (magnitude));
8488
85- return String::num (num, precision);
89+ r_result += String::num (num, precision);
90+ return ;
8691 }
8792 case Variant::PACKED_INT32_ARRAY:
8893 case Variant::PACKED_INT64_ARRAY:
@@ -91,35 +96,47 @@ String JSON::_stringify(const Variant &p_var, const String &p_indent, int p_cur_
9196 case Variant::PACKED_STRING_ARRAY:
9297 case Variant::ARRAY: {
9398 Array a = p_var;
99+ if (p_markers.has (a.id ())) {
100+ r_result += " \" [...]\" " ;
101+ ERR_FAIL_MSG (" Converting circular structure to JSON." );
102+ }
103+
94104 if (a.is_empty ()) {
95- return " []" ;
105+ r_result += " []" ;
106+ return ;
96107 }
97- String s = " [" ;
98- s += end_statement;
99108
100- ERR_FAIL_COND_V_MSG (p_markers.has (a.id ()), " \" [...]\" " , " Converting circular structure to JSON." );
109+ r_result += ' [' ;
110+ r_result += end_statement;
111+
101112 p_markers.insert (a.id ());
102113
103114 bool first = true ;
104115 for (const Variant &var : a) {
105116 if (first) {
106117 first = false ;
107118 } else {
108- s += " , " ;
109- s += end_statement;
119+ r_result += ' , ' ;
120+ r_result += end_statement;
110121 }
111- s += _make_indent (p_indent, p_cur_indent + 1 ) + _stringify (var, p_indent, p_cur_indent + 1 , p_sort_keys, p_markers);
122+ _add_indent (r_result, p_indent, p_cur_indent + 1 );
123+ _stringify (r_result, var, p_indent, p_cur_indent + 1 , p_sort_keys, p_markers);
112124 }
113- s += end_statement + _make_indent (p_indent, p_cur_indent) + " ]" ;
125+ r_result += end_statement;
126+ _add_indent (r_result, p_indent, p_cur_indent);
127+ r_result += ' ]' ;
114128 p_markers.erase (a.id ());
115- return s ;
129+ return ;
116130 }
117131 case Variant::DICTIONARY: {
118- String s = " {" ;
119- s += end_statement;
120132 Dictionary d = p_var;
133+ if (p_markers.has (d.id ())) {
134+ r_result += " \" {...}\" " ;
135+ ERR_FAIL_MSG (" Converting circular structure to JSON." );
136+ }
121137
122- ERR_FAIL_COND_V_MSG (p_markers.has (d.id ()), " \" {...}\" " , " Converting circular structure to JSON." );
138+ r_result += ' {' ;
139+ r_result += end_statement;
123140 p_markers.insert (d.id ());
124141
125142 LocalVector<Variant> keys = d.get_key_list ();
@@ -129,24 +146,30 @@ String JSON::_stringify(const Variant &p_var, const String &p_indent, int p_cur_
129146 }
130147
131148 bool first_key = true ;
132- for (const Variant &E : keys) {
149+ for (const Variant &key : keys) {
133150 if (first_key) {
134151 first_key = false ;
135152 } else {
136- s += " , " ;
137- s += end_statement;
153+ r_result += ' , ' ;
154+ r_result += end_statement;
138155 }
139- s += _make_indent (p_indent, p_cur_indent + 1 ) + _stringify (String (E), p_indent, p_cur_indent + 1 , p_sort_keys, p_markers);
140- s += colon;
141- s += _stringify (d[E], p_indent, p_cur_indent + 1 , p_sort_keys, p_markers);
156+ _add_indent (r_result, p_indent, p_cur_indent + 1 );
157+ _stringify (r_result, String (key), p_indent, p_cur_indent + 1 , p_sort_keys, p_markers);
158+ r_result += colon;
159+ _stringify (r_result, d[key], p_indent, p_cur_indent + 1 , p_sort_keys, p_markers);
142160 }
143161
144- s += end_statement + _make_indent (p_indent, p_cur_indent) + " }" ;
162+ r_result += end_statement;
163+ _add_indent (r_result, p_indent, p_cur_indent);
164+ r_result += ' }' ;
145165 p_markers.erase (d.id ());
146- return s ;
166+ return ;
147167 }
148168 default :
149- return " \" " + String (p_var).json_escape () + " \" " ;
169+ r_result += ' "' ;
170+ r_result += String (p_var).json_escape ();
171+ r_result += ' "' ;
172+ return ;
150173 }
151174}
152175
@@ -568,10 +591,10 @@ String JSON::get_parsed_text() const {
568591}
569592
570593String JSON::stringify (const Variant &p_var, const String &p_indent, bool p_sort_keys, bool p_full_precision) {
571- Ref<JSON> json;
572- json.instantiate ();
594+ String result;
573595 HashSet<const void *> markers;
574- return json->_stringify (p_var, p_indent, 0 , p_sort_keys, markers, p_full_precision);
596+ _stringify (result, p_var, p_indent, 0 , p_sort_keys, markers, p_full_precision);
597+ return result;
575598}
576599
577600Variant JSON::parse_string (const String &p_json_string) {
0 commit comments