Add indent and sort keys support for JSON.print
This commit is contained in:
parent
c880302754
commit
f7168bf217
4 changed files with 46 additions and 19 deletions
core
|
@ -2669,12 +2669,12 @@ Variant JSONParseResult::get_result() const {
|
|||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
String _JSON::print(const Variant &p_value) {
|
||||
return JSON::print(p_value);
|
||||
String _JSON::print(const Variant &p_value, const String &p_indent, bool p_sort_keys) {
|
||||
return JSON::print(p_value, p_indent, p_sort_keys);
|
||||
}
|
||||
|
||||
Ref<JSONParseResult> _JSON::parse(const String &p_json) {
|
||||
|
|
|
@ -714,7 +714,7 @@ protected:
|
|||
public:
|
||||
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);
|
||||
|
||||
_JSON();
|
||||
|
|
|
@ -43,7 +43,25 @@ const char *JSON::tk_name[TK_MAX] = {
|
|||
"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()) {
|
||||
|
||||
|
@ -57,41 +75,50 @@ String JSON::_print_var(const Variant &p_var) {
|
|||
case Variant::ARRAY: {
|
||||
|
||||
String s = "[";
|
||||
s += end_statement;
|
||||
Array a = p_var;
|
||||
for (int i = 0; i < a.size(); i++) {
|
||||
if (i > 0)
|
||||
s += ", ";
|
||||
s += _print_var(a[i]);
|
||||
if (i > 0) {
|
||||
s += ",";
|
||||
s += end_statement;
|
||||
}
|
||||
s += _make_indent(p_indent, p_cur_indent + 1) + _print_var(a[i], p_indent, p_cur_indent + 1, p_sort_keys);
|
||||
}
|
||||
s += "]";
|
||||
s += end_statement + _make_indent(p_indent, p_cur_indent) + "]";
|
||||
return s;
|
||||
};
|
||||
case Variant::DICTIONARY: {
|
||||
|
||||
String s = "{";
|
||||
s += end_statement;
|
||||
Dictionary d = p_var;
|
||||
List<Variant> keys;
|
||||
d.get_key_list(&keys);
|
||||
|
||||
if (p_sort_keys)
|
||||
keys.sort();
|
||||
|
||||
for (List<Variant>::Element *E = keys.front(); E; E = E->next()) {
|
||||
|
||||
if (E != keys.front())
|
||||
s += ", ";
|
||||
s += _print_var(String(E->get()));
|
||||
s += ":";
|
||||
s += _print_var(d[E->get()]);
|
||||
if (E != keys.front()) {
|
||||
s += ",";
|
||||
s += end_statement;
|
||||
}
|
||||
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;
|
||||
};
|
||||
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) {
|
||||
|
|
|
@ -64,7 +64,7 @@ class JSON {
|
|||
|
||||
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 _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);
|
||||
|
||||
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);
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue