String JSON::_print_var(const Variant& p_var) { switch(p_var.get_type()) { case Variant::NIL: return "null"; case Variant::BOOL: return p_var.operator bool() ? "true": "false"; case Variant::INT: return itos(p_var); case Variant::REAL: return rtos(p_var); case Variant::INT_ARRAY: case Variant::REAL_ARRAY: case Variant::STRING_ARRAY: case Variant::ARRAY: { String s = "["; Array a = p_var; for(int i=0;i<a.size();i++) { if (i>0) s+=", "; s+=_print_var(a[i]); } s+="]"; return s; }; case Variant::DICTIONARY: { String s = "{"; Dictionary d = p_var; List<Variant> keys; d.get_key_list(&keys); 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()]); } s+="}"; return s; }; default: return "\""+String(p_var).c_escape()+"\""; } }
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()) { case Variant::NIL: return "null"; case Variant::BOOL: return p_var.operator bool() ? "true" : "false"; case Variant::INT: return itos(p_var); case Variant::REAL: return rtos(p_var); case Variant::POOL_INT_ARRAY: case Variant::POOL_REAL_ARRAY: case Variant::POOL_STRING_ARRAY: 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 += 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 += 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 += 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 += 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, const String &p_indent, bool p_sort_keys) { return _print_var(p_var, p_indent, 0, p_sort_keys); }
String JSON::print(const Dictionary& p_dict) { return _print_var(p_dict); }