Merge pull request #12603 from GodotExplorer/beautify-json
Add indent and sort keys support for JSON.print
This commit is contained in:
commit
e6f3253f7d
|
@ -2694,12 +2694,12 @@ Variant JSONParseResult::get_result() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void _JSON::_bind_methods() {
|
void _JSON::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("print", "value"), &_JSON::print);
|
ClassDB::bind_method(D_METHOD("print", "value", "indent", "sort_keys"), &_JSON::print, DEFVAL(String()), DEFVAL(false));
|
||||||
ClassDB::bind_method(D_METHOD("parse", "json"), &_JSON::parse);
|
ClassDB::bind_method(D_METHOD("parse", "json"), &_JSON::parse);
|
||||||
}
|
}
|
||||||
|
|
||||||
String _JSON::print(const Variant &p_value) {
|
String _JSON::print(const Variant &p_value, const String &p_indent, bool p_sort_keys) {
|
||||||
return JSON::print(p_value);
|
return JSON::print(p_value, p_indent, p_sort_keys);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<JSONParseResult> _JSON::parse(const String &p_json) {
|
Ref<JSONParseResult> _JSON::parse(const String &p_json) {
|
||||||
|
|
|
@ -719,7 +719,7 @@ protected:
|
||||||
public:
|
public:
|
||||||
static _JSON *get_singleton() { return singleton; }
|
static _JSON *get_singleton() { return singleton; }
|
||||||
|
|
||||||
String print(const Variant &p_value);
|
String print(const Variant &p_value, const String &p_indent = "", bool p_sort_keys = false);
|
||||||
Ref<JSONParseResult> parse(const String &p_json);
|
Ref<JSONParseResult> parse(const String &p_json);
|
||||||
|
|
||||||
_JSON();
|
_JSON();
|
||||||
|
|
|
@ -43,7 +43,25 @@ const char *JSON::tk_name[TK_MAX] = {
|
||||||
"EOF",
|
"EOF",
|
||||||
};
|
};
|
||||||
|
|
||||||
String JSON::_print_var(const Variant &p_var) {
|
static String _make_indent(const String& p_indent, int p_size) {
|
||||||
|
|
||||||
|
String indent_text = "";
|
||||||
|
if (!p_indent.empty()) {
|
||||||
|
for (int i = 0; i < p_size; i++)
|
||||||
|
indent_text += p_indent;
|
||||||
|
}
|
||||||
|
return indent_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
String JSON::_print_var(const Variant &p_var, const String& p_indent, int p_cur_indent, bool p_sort_keys) {
|
||||||
|
|
||||||
|
String colon = ":";
|
||||||
|
String end_statement = "";
|
||||||
|
|
||||||
|
if (!p_indent.empty()) {
|
||||||
|
colon += " ";
|
||||||
|
end_statement += "\n";
|
||||||
|
}
|
||||||
|
|
||||||
switch (p_var.get_type()) {
|
switch (p_var.get_type()) {
|
||||||
|
|
||||||
|
@ -57,41 +75,50 @@ String JSON::_print_var(const Variant &p_var) {
|
||||||
case Variant::ARRAY: {
|
case Variant::ARRAY: {
|
||||||
|
|
||||||
String s = "[";
|
String s = "[";
|
||||||
|
s += end_statement;
|
||||||
Array a = p_var;
|
Array a = p_var;
|
||||||
for (int i = 0; i < a.size(); i++) {
|
for (int i = 0; i < a.size(); i++) {
|
||||||
if (i > 0)
|
if (i > 0) {
|
||||||
s += ",";
|
s += ",";
|
||||||
s += _print_var(a[i]);
|
s += end_statement;
|
||||||
}
|
}
|
||||||
s += "]";
|
s += _make_indent(p_indent, p_cur_indent + 1) + _print_var(a[i], p_indent, p_cur_indent + 1, p_sort_keys);
|
||||||
|
}
|
||||||
|
s += end_statement + _make_indent(p_indent, p_cur_indent) + "]";
|
||||||
return s;
|
return s;
|
||||||
};
|
};
|
||||||
case Variant::DICTIONARY: {
|
case Variant::DICTIONARY: {
|
||||||
|
|
||||||
String s = "{";
|
String s = "{";
|
||||||
|
s += end_statement;
|
||||||
Dictionary d = p_var;
|
Dictionary d = p_var;
|
||||||
List<Variant> keys;
|
List<Variant> keys;
|
||||||
d.get_key_list(&keys);
|
d.get_key_list(&keys);
|
||||||
|
|
||||||
|
if (p_sort_keys)
|
||||||
|
keys.sort();
|
||||||
|
|
||||||
for (List<Variant>::Element *E = keys.front(); E; E = E->next()) {
|
for (List<Variant>::Element *E = keys.front(); E; E = E->next()) {
|
||||||
|
|
||||||
if (E != keys.front())
|
if (E != keys.front()) {
|
||||||
s += ",";
|
s += ",";
|
||||||
s += _print_var(String(E->get()));
|
s += end_statement;
|
||||||
s += ":";
|
}
|
||||||
s += _print_var(d[E->get()]);
|
s += _make_indent(p_indent, p_cur_indent + 1) + _print_var(String(E->get()), p_indent, p_cur_indent + 1, p_sort_keys);
|
||||||
|
s += colon;
|
||||||
|
s += _print_var(d[E->get()], p_indent, p_cur_indent + 1, p_sort_keys);
|
||||||
}
|
}
|
||||||
|
|
||||||
s += "}";
|
s += end_statement + _make_indent(p_indent, p_cur_indent) + "}";
|
||||||
return s;
|
return s;
|
||||||
};
|
};
|
||||||
default: return "\"" + String(p_var).json_escape() + "\"";
|
default: return "\"" + String(p_var).json_escape() + "\"";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String JSON::print(const Variant &p_var) {
|
String JSON::print(const Variant &p_var, const String& p_indent, bool p_sort_keys) {
|
||||||
|
|
||||||
return _print_var(p_var);
|
return _print_var(p_var, p_indent, 0, p_sort_keys);
|
||||||
}
|
}
|
||||||
|
|
||||||
Error JSON::_get_token(const CharType *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str) {
|
Error JSON::_get_token(const CharType *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str) {
|
||||||
|
|
|
@ -64,7 +64,7 @@ class JSON {
|
||||||
|
|
||||||
static const char *tk_name[TK_MAX];
|
static const char *tk_name[TK_MAX];
|
||||||
|
|
||||||
static String _print_var(const Variant &p_var);
|
static String _print_var(const Variant &p_var, const String& p_indent, int p_cur_indent, bool p_sort_keys);
|
||||||
|
|
||||||
static Error _get_token(const CharType *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str);
|
static Error _get_token(const CharType *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str);
|
||||||
static Error _parse_value(Variant &value, Token &token, const CharType *p_str, int &index, int p_len, int &line, String &r_err_str);
|
static Error _parse_value(Variant &value, Token &token, const CharType *p_str, int &index, int p_len, int &line, String &r_err_str);
|
||||||
|
@ -72,7 +72,7 @@ class JSON {
|
||||||
static Error _parse_object(Dictionary &object, const CharType *p_str, int &index, int p_len, int &line, String &r_err_str);
|
static Error _parse_object(Dictionary &object, const CharType *p_str, int &index, int p_len, int &line, String &r_err_str);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static String print(const Variant &p_var);
|
static String print(const Variant &p_var, const String& p_indent = "", bool p_sort_keys = true);
|
||||||
static Error parse(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line);
|
static Error parse(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue