Consolidate JSON, JSONParseResults and JSONParser into JSON
Renames JSON.parse_string() to parse() Renames JSON.decode_data() to stringify()
This commit is contained in:
parent
df170c8af0
commit
2bafcd3422
|
@ -35,7 +35,6 @@
|
||||||
#include "core/debugger/engine_debugger.h"
|
#include "core/debugger/engine_debugger.h"
|
||||||
#include "core/io/file_access_compressed.h"
|
#include "core/io/file_access_compressed.h"
|
||||||
#include "core/io/file_access_encrypted.h"
|
#include "core/io/file_access_encrypted.h"
|
||||||
#include "core/io/json.h"
|
|
||||||
#include "core/io/marshalls.h"
|
#include "core/io/marshalls.h"
|
||||||
#include "core/math/geometry_2d.h"
|
#include "core/math/geometry_2d.h"
|
||||||
#include "core/math/geometry_3d.h"
|
#include "core/math/geometry_3d.h"
|
||||||
|
@ -2137,80 +2136,6 @@ void _Engine::_bind_methods() {
|
||||||
|
|
||||||
_Engine *_Engine::singleton = nullptr;
|
_Engine *_Engine::singleton = nullptr;
|
||||||
|
|
||||||
////// _JSON //////
|
|
||||||
|
|
||||||
void JSONParseResult::_bind_methods() {
|
|
||||||
ClassDB::bind_method(D_METHOD("get_error"), &JSONParseResult::get_error);
|
|
||||||
ClassDB::bind_method(D_METHOD("get_error_string"), &JSONParseResult::get_error_string);
|
|
||||||
ClassDB::bind_method(D_METHOD("get_error_line"), &JSONParseResult::get_error_line);
|
|
||||||
ClassDB::bind_method(D_METHOD("get_result"), &JSONParseResult::get_result);
|
|
||||||
|
|
||||||
ClassDB::bind_method(D_METHOD("set_error", "error"), &JSONParseResult::set_error);
|
|
||||||
ClassDB::bind_method(D_METHOD("set_error_string", "error_string"), &JSONParseResult::set_error_string);
|
|
||||||
ClassDB::bind_method(D_METHOD("set_error_line", "error_line"), &JSONParseResult::set_error_line);
|
|
||||||
ClassDB::bind_method(D_METHOD("set_result", "result"), &JSONParseResult::set_result);
|
|
||||||
|
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "error", PROPERTY_HINT_NONE, "Error", PROPERTY_USAGE_CLASS_IS_ENUM), "set_error", "get_error");
|
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::STRING, "error_string"), "set_error_string", "get_error_string");
|
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "error_line"), "set_error_line", "get_error_line");
|
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::NIL, "result", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NIL_IS_VARIANT), "set_result", "get_result");
|
|
||||||
}
|
|
||||||
|
|
||||||
void JSONParseResult::set_error(Error p_error) {
|
|
||||||
error = p_error;
|
|
||||||
}
|
|
||||||
|
|
||||||
Error JSONParseResult::get_error() const {
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JSONParseResult::set_error_string(const String &p_error_string) {
|
|
||||||
error_string = p_error_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
String JSONParseResult::get_error_string() const {
|
|
||||||
return error_string;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JSONParseResult::set_error_line(int p_error_line) {
|
|
||||||
error_line = p_error_line;
|
|
||||||
}
|
|
||||||
|
|
||||||
int JSONParseResult::get_error_line() const {
|
|
||||||
return error_line;
|
|
||||||
}
|
|
||||||
|
|
||||||
void JSONParseResult::set_result(const Variant &p_result) {
|
|
||||||
result = p_result;
|
|
||||||
}
|
|
||||||
|
|
||||||
Variant JSONParseResult::get_result() const {
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void _JSON::_bind_methods() {
|
|
||||||
ClassDB::bind_method(D_METHOD("print", "value", "indent", "sort_keys", "full_precision"), &_JSON::print, DEFVAL(String()), DEFVAL(false), DEFVAL(false));
|
|
||||||
ClassDB::bind_method(D_METHOD("parse", "json"), &_JSON::parse);
|
|
||||||
}
|
|
||||||
|
|
||||||
String _JSON::print(const Variant &p_value, const String &p_indent, bool p_sort_keys, bool p_full_precision) {
|
|
||||||
return JSON::print(p_value, p_indent, p_sort_keys, p_full_precision);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ref<JSONParseResult> _JSON::parse(const String &p_json) {
|
|
||||||
Ref<JSONParseResult> result;
|
|
||||||
result.instance();
|
|
||||||
|
|
||||||
result->error = JSON::parse(p_json, result->result, result->error_string, result->error_line);
|
|
||||||
|
|
||||||
if (result->error != OK) {
|
|
||||||
ERR_PRINT(vformat("Error parsing JSON at line %s: %s", result->error_line, result->error_string));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
_JSON *_JSON::singleton = nullptr;
|
|
||||||
|
|
||||||
////// _EngineDebugger //////
|
////// _EngineDebugger //////
|
||||||
|
|
||||||
void _EngineDebugger::_bind_methods() {
|
void _EngineDebugger::_bind_methods() {
|
||||||
|
|
|
@ -656,54 +656,6 @@ public:
|
||||||
_Engine() { singleton = this; }
|
_Engine() { singleton = this; }
|
||||||
};
|
};
|
||||||
|
|
||||||
class _JSON;
|
|
||||||
|
|
||||||
class JSONParseResult : public RefCounted {
|
|
||||||
GDCLASS(JSONParseResult, RefCounted);
|
|
||||||
|
|
||||||
friend class _JSON;
|
|
||||||
|
|
||||||
Error error;
|
|
||||||
String error_string;
|
|
||||||
int error_line = -1;
|
|
||||||
|
|
||||||
Variant result;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
static void _bind_methods();
|
|
||||||
|
|
||||||
public:
|
|
||||||
void set_error(Error p_error);
|
|
||||||
Error get_error() const;
|
|
||||||
|
|
||||||
void set_error_string(const String &p_error_string);
|
|
||||||
String get_error_string() const;
|
|
||||||
|
|
||||||
void set_error_line(int p_error_line);
|
|
||||||
int get_error_line() const;
|
|
||||||
|
|
||||||
void set_result(const Variant &p_result);
|
|
||||||
Variant get_result() const;
|
|
||||||
|
|
||||||
JSONParseResult() {}
|
|
||||||
};
|
|
||||||
|
|
||||||
class _JSON : public Object {
|
|
||||||
GDCLASS(_JSON, Object);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
static void _bind_methods();
|
|
||||||
static _JSON *singleton;
|
|
||||||
|
|
||||||
public:
|
|
||||||
static _JSON *get_singleton() { return singleton; }
|
|
||||||
|
|
||||||
String print(const Variant &p_value, const String &p_indent = "", bool p_sort_keys = false, bool p_full_precision = false);
|
|
||||||
Ref<JSONParseResult> parse(const String &p_json);
|
|
||||||
|
|
||||||
_JSON() { singleton = this; }
|
|
||||||
};
|
|
||||||
|
|
||||||
class _EngineDebugger : public Object {
|
class _EngineDebugger : public Object {
|
||||||
GDCLASS(_EngineDebugger, Object);
|
GDCLASS(_EngineDebugger, Object);
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ const char *JSON::tk_name[TK_MAX] = {
|
||||||
"EOF",
|
"EOF",
|
||||||
};
|
};
|
||||||
|
|
||||||
static String _make_indent(const String &p_indent, int p_size) {
|
String JSON::_make_indent(const String &p_indent, int p_size) {
|
||||||
String indent_text = "";
|
String indent_text = "";
|
||||||
if (!p_indent.is_empty()) {
|
if (!p_indent.is_empty()) {
|
||||||
for (int i = 0; i < p_size; i++) {
|
for (int i = 0; i < p_size; i++) {
|
||||||
|
@ -55,7 +55,7 @@ static String _make_indent(const String &p_indent, int p_size) {
|
||||||
return indent_text;
|
return indent_text;
|
||||||
}
|
}
|
||||||
|
|
||||||
String JSON::_print_var(const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, Set<const void *> &p_markers, bool p_full_precision) {
|
String JSON::_stringify(const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, Set<const void *> &p_markers, bool p_full_precision) {
|
||||||
String colon = ":";
|
String colon = ":";
|
||||||
String end_statement = "";
|
String end_statement = "";
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ String JSON::_print_var(const Variant &p_var, const String &p_indent, int p_cur_
|
||||||
s += ",";
|
s += ",";
|
||||||
s += end_statement;
|
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, p_markers);
|
s += _make_indent(p_indent, p_cur_indent + 1) + _stringify(a[i], p_indent, p_cur_indent + 1, p_sort_keys, p_markers);
|
||||||
}
|
}
|
||||||
s += end_statement + _make_indent(p_indent, p_cur_indent) + "]";
|
s += end_statement + _make_indent(p_indent, p_cur_indent) + "]";
|
||||||
p_markers.erase(a.id());
|
p_markers.erase(a.id());
|
||||||
|
@ -126,9 +126,9 @@ String JSON::_print_var(const Variant &p_var, const String &p_indent, int p_cur_
|
||||||
s += ",";
|
s += ",";
|
||||||
s += end_statement;
|
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, p_markers);
|
s += _make_indent(p_indent, p_cur_indent + 1) + _stringify(String(E->get()), p_indent, p_cur_indent + 1, p_sort_keys, p_markers);
|
||||||
s += colon;
|
s += colon;
|
||||||
s += _print_var(d[E->get()], p_indent, p_cur_indent + 1, p_sort_keys, p_markers);
|
s += _stringify(d[E->get()], p_indent, p_cur_indent + 1, p_sort_keys, p_markers);
|
||||||
}
|
}
|
||||||
|
|
||||||
s += end_statement + _make_indent(p_indent, p_cur_indent) + "}";
|
s += end_statement + _make_indent(p_indent, p_cur_indent) + "}";
|
||||||
|
@ -140,11 +140,6 @@ String JSON::_print_var(const Variant &p_var, const String &p_indent, int p_cur_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String JSON::print(const Variant &p_var, const String &p_indent, bool p_sort_keys, bool p_full_precision) {
|
|
||||||
Set<const void *> markers;
|
|
||||||
return _print_var(p_var, p_indent, 0, p_sort_keys, markers, p_full_precision);
|
|
||||||
}
|
|
||||||
|
|
||||||
Error JSON::_get_token(const char32_t *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str) {
|
Error JSON::_get_token(const char32_t *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str) {
|
||||||
while (p_len > 0) {
|
while (p_len > 0) {
|
||||||
switch (p_str[index]) {
|
switch (p_str[index]) {
|
||||||
|
@ -499,7 +494,7 @@ Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index,
|
||||||
return ERR_PARSE_ERROR;
|
return ERR_PARSE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error JSON::parse(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line) {
|
Error JSON::_parse_string(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line) {
|
||||||
const char32_t *str = p_json.ptr();
|
const char32_t *str = p_json.ptr();
|
||||||
int idx = 0;
|
int idx = 0;
|
||||||
int len = p_json.length();
|
int len = p_json.length();
|
||||||
|
@ -530,34 +525,24 @@ Error JSON::parse(const String &p_json, Variant &r_ret, String &r_err_str, int &
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
Error JSONParser::parse_string(const String &p_json_string) {
|
String JSON::stringify(const Variant &p_var, const String &p_indent, bool p_sort_keys, bool p_full_precision) {
|
||||||
return JSON::parse(p_json_string, data, err_text, err_line);
|
Set<const void *> markers;
|
||||||
}
|
return _stringify(p_var, p_indent, 0, p_sort_keys, markers, p_full_precision);
|
||||||
String JSONParser::get_error_text() const {
|
|
||||||
return err_text;
|
|
||||||
}
|
|
||||||
int JSONParser::get_error_line() const {
|
|
||||||
return err_line;
|
|
||||||
}
|
|
||||||
Variant JSONParser::get_data() const {
|
|
||||||
return data;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Error JSONParser::decode_data(const Variant &p_data, const String &p_indent, bool p_sort_keys) {
|
Error JSON::parse(const String &p_json_string) {
|
||||||
string = JSON::print(p_data, p_indent, p_sort_keys);
|
Error err = _parse_string(p_json_string, data, err_str, err_line);
|
||||||
data = p_data;
|
if (err == Error::OK) {
|
||||||
return OK;
|
err_line = 0;
|
||||||
|
}
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
String JSONParser::get_string() const {
|
void JSON::_bind_methods() {
|
||||||
return string;
|
ClassDB::bind_method(D_METHOD("stringify", "data", "indent", "sort_keys", "full_precision"), &JSON::stringify, DEFVAL(""), DEFVAL(true), DEFVAL(false));
|
||||||
}
|
ClassDB::bind_method(D_METHOD("parse", "json_string"), &JSON::parse);
|
||||||
|
|
||||||
void JSONParser::_bind_methods() {
|
ClassDB::bind_method(D_METHOD("get_data"), &JSON::get_data);
|
||||||
ClassDB::bind_method(D_METHOD("parse_string", "json_string"), &JSONParser::parse_string);
|
ClassDB::bind_method(D_METHOD("get_error_line"), &JSON::get_error_line);
|
||||||
ClassDB::bind_method(D_METHOD("get_error_text"), &JSONParser::get_error_text);
|
ClassDB::bind_method(D_METHOD("get_error_message"), &JSON::get_error_message);
|
||||||
ClassDB::bind_method(D_METHOD("get_error_line"), &JSONParser::get_error_line);
|
|
||||||
ClassDB::bind_method(D_METHOD("get_data"), &JSONParser::get_data);
|
|
||||||
ClassDB::bind_method(D_METHOD("decode_data", "data", "indent", "sort_keys"), &JSONParser::decode_data, DEFVAL(""), DEFVAL(true));
|
|
||||||
ClassDB::bind_method(D_METHOD("get_string"), &JSONParser::get_string);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,10 @@
|
||||||
|
|
||||||
#include "core/object/ref_counted.h"
|
#include "core/object/ref_counted.h"
|
||||||
#include "core/variant/variant.h"
|
#include "core/variant/variant.h"
|
||||||
class JSON {
|
|
||||||
|
class JSON : public RefCounted {
|
||||||
|
GDCLASS(JSON, RefCounted);
|
||||||
|
|
||||||
enum TokenType {
|
enum TokenType {
|
||||||
TK_CURLY_BRACKET_OPEN,
|
TK_CURLY_BRACKET_OPEN,
|
||||||
TK_CURLY_BRACKET_CLOSE,
|
TK_CURLY_BRACKET_CLOSE,
|
||||||
|
@ -60,39 +63,30 @@ class JSON {
|
||||||
Variant value;
|
Variant value;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *tk_name[TK_MAX];
|
Variant data;
|
||||||
|
String err_str;
|
||||||
|
int err_line = 0;
|
||||||
|
|
||||||
static String _print_var(const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, Set<const void *> &p_markers, bool p_full_precision = false);
|
static const char *tk_name[];
|
||||||
|
|
||||||
|
static String _make_indent(const String &p_indent, int p_size);
|
||||||
|
static String _stringify(const Variant &p_var, const String &p_indent, int p_cur_indent, bool p_sort_keys, Set<const void *> &p_markers, bool p_full_precision = false);
|
||||||
static Error _get_token(const char32_t *p_str, int &index, int p_len, Token &r_token, int &line, String &r_err_str);
|
static Error _get_token(const char32_t *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 char32_t *p_str, int &index, int p_len, int &line, String &r_err_str);
|
static Error _parse_value(Variant &value, Token &token, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str);
|
||||||
static Error _parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str);
|
static Error _parse_array(Array &array, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str);
|
||||||
static Error _parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str);
|
static Error _parse_object(Dictionary &object, const char32_t *p_str, int &index, int p_len, int &line, String &r_err_str);
|
||||||
|
static Error _parse_string(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line);
|
||||||
public:
|
|
||||||
static String print(const Variant &p_var, const String &p_indent = "", bool p_sort_keys = true, bool p_full_precision = false);
|
|
||||||
static Error parse(const String &p_json, Variant &r_ret, String &r_err_str, int &r_err_line);
|
|
||||||
};
|
|
||||||
|
|
||||||
class JSONParser : public RefCounted {
|
|
||||||
GDCLASS(JSONParser, RefCounted);
|
|
||||||
|
|
||||||
Variant data;
|
|
||||||
String string;
|
|
||||||
String err_text;
|
|
||||||
int err_line = 0;
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Error parse_string(const String &p_json_string);
|
String stringify(const Variant &p_var, const String &p_indent = "", bool p_sort_keys = true, bool p_full_precision = false);
|
||||||
String get_error_text() const;
|
Error parse(const String &p_json_string);
|
||||||
int get_error_line() const;
|
|
||||||
Variant get_data() const;
|
|
||||||
|
|
||||||
Error decode_data(const Variant &p_data, const String &p_indent = "", bool p_sort_keys = true);
|
inline Variant get_data() const { return data; }
|
||||||
String get_string() const;
|
inline int get_error_line() const { return err_line; }
|
||||||
|
inline String get_error_message() const { return err_str; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // JSON_H
|
#endif // JSON_H
|
||||||
|
|
|
@ -86,7 +86,6 @@ static _OS *_os = nullptr;
|
||||||
static _Engine *_engine = nullptr;
|
static _Engine *_engine = nullptr;
|
||||||
static _ClassDB *_classdb = nullptr;
|
static _ClassDB *_classdb = nullptr;
|
||||||
static _Marshalls *_marshalls = nullptr;
|
static _Marshalls *_marshalls = nullptr;
|
||||||
static _JSON *_json = nullptr;
|
|
||||||
static _EngineDebugger *_engine_debugger = nullptr;
|
static _EngineDebugger *_engine_debugger = nullptr;
|
||||||
|
|
||||||
static IP *ip = nullptr;
|
static IP *ip = nullptr;
|
||||||
|
@ -199,7 +198,7 @@ void register_core_types() {
|
||||||
ClassDB::register_class<_Semaphore>();
|
ClassDB::register_class<_Semaphore>();
|
||||||
|
|
||||||
ClassDB::register_class<XMLParser>();
|
ClassDB::register_class<XMLParser>();
|
||||||
ClassDB::register_class<JSONParser>();
|
ClassDB::register_class<JSON>();
|
||||||
|
|
||||||
ClassDB::register_class<ConfigFile>();
|
ClassDB::register_class<ConfigFile>();
|
||||||
|
|
||||||
|
@ -212,8 +211,6 @@ void register_core_types() {
|
||||||
ClassDB::register_class<EncodedObjectAsID>();
|
ClassDB::register_class<EncodedObjectAsID>();
|
||||||
ClassDB::register_class<RandomNumberGenerator>();
|
ClassDB::register_class<RandomNumberGenerator>();
|
||||||
|
|
||||||
ClassDB::register_class<JSONParseResult>();
|
|
||||||
|
|
||||||
ClassDB::register_virtual_class<ResourceImporter>();
|
ClassDB::register_virtual_class<ResourceImporter>();
|
||||||
|
|
||||||
ip = IP::create();
|
ip = IP::create();
|
||||||
|
@ -227,7 +224,6 @@ void register_core_types() {
|
||||||
_engine = memnew(_Engine);
|
_engine = memnew(_Engine);
|
||||||
_classdb = memnew(_ClassDB);
|
_classdb = memnew(_ClassDB);
|
||||||
_marshalls = memnew(_Marshalls);
|
_marshalls = memnew(_Marshalls);
|
||||||
_json = memnew(_JSON);
|
|
||||||
_engine_debugger = memnew(_EngineDebugger);
|
_engine_debugger = memnew(_EngineDebugger);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -256,7 +252,6 @@ void register_core_singletons() {
|
||||||
ClassDB::register_class<TranslationServer>();
|
ClassDB::register_class<TranslationServer>();
|
||||||
ClassDB::register_virtual_class<Input>();
|
ClassDB::register_virtual_class<Input>();
|
||||||
ClassDB::register_class<InputMap>();
|
ClassDB::register_class<InputMap>();
|
||||||
ClassDB::register_class<_JSON>();
|
|
||||||
ClassDB::register_class<Expression>();
|
ClassDB::register_class<Expression>();
|
||||||
ClassDB::register_class<_EngineDebugger>();
|
ClassDB::register_class<_EngineDebugger>();
|
||||||
ClassDB::register_class<Time>();
|
ClassDB::register_class<Time>();
|
||||||
|
@ -274,7 +269,6 @@ void register_core_singletons() {
|
||||||
Engine::get_singleton()->add_singleton(Engine::Singleton("TranslationServer", TranslationServer::get_singleton()));
|
Engine::get_singleton()->add_singleton(Engine::Singleton("TranslationServer", TranslationServer::get_singleton()));
|
||||||
Engine::get_singleton()->add_singleton(Engine::Singleton("Input", Input::get_singleton()));
|
Engine::get_singleton()->add_singleton(Engine::Singleton("Input", Input::get_singleton()));
|
||||||
Engine::get_singleton()->add_singleton(Engine::Singleton("InputMap", InputMap::get_singleton()));
|
Engine::get_singleton()->add_singleton(Engine::Singleton("InputMap", InputMap::get_singleton()));
|
||||||
Engine::get_singleton()->add_singleton(Engine::Singleton("JSON", _JSON::get_singleton()));
|
|
||||||
Engine::get_singleton()->add_singleton(Engine::Singleton("EngineDebugger", _EngineDebugger::get_singleton()));
|
Engine::get_singleton()->add_singleton(Engine::Singleton("EngineDebugger", _EngineDebugger::get_singleton()));
|
||||||
Engine::get_singleton()->add_singleton(Engine::Singleton("Time", Time::get_singleton()));
|
Engine::get_singleton()->add_singleton(Engine::Singleton("Time", Time::get_singleton()));
|
||||||
}
|
}
|
||||||
|
@ -286,7 +280,6 @@ void unregister_core_types() {
|
||||||
memdelete(_engine);
|
memdelete(_engine);
|
||||||
memdelete(_classdb);
|
memdelete(_classdb);
|
||||||
memdelete(_marshalls);
|
memdelete(_marshalls);
|
||||||
memdelete(_json);
|
|
||||||
memdelete(_engine_debugger);
|
memdelete(_engine_debugger);
|
||||||
|
|
||||||
memdelete(_geometry_2d);
|
memdelete(_geometry_2d);
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
|
|
||||||
#include "core/core_string_names.h"
|
#include "core/core_string_names.h"
|
||||||
#include "core/debugger/engine_debugger.h"
|
#include "core/debugger/engine_debugger.h"
|
||||||
|
#include "core/io/json.h"
|
||||||
#include "core/io/marshalls.h"
|
#include "core/io/marshalls.h"
|
||||||
#include "core/io/resource.h"
|
#include "core/io/resource.h"
|
||||||
#include "core/math/math_funcs.h"
|
#include "core/math/math_funcs.h"
|
||||||
|
@ -1838,6 +1839,11 @@ String Variant::stringify(List<const void *> &stack) const {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String Variant::to_json_string() const {
|
||||||
|
JSON json;
|
||||||
|
return json.stringify(*this);
|
||||||
|
}
|
||||||
|
|
||||||
Variant::operator Vector2() const {
|
Variant::operator Vector2() const {
|
||||||
if (type == VECTOR2) {
|
if (type == VECTOR2) {
|
||||||
return *reinterpret_cast<const Vector2 *>(_data._mem);
|
return *reinterpret_cast<const Vector2 *>(_data._mem);
|
||||||
|
|
|
@ -645,6 +645,7 @@ public:
|
||||||
bool hash_compare(const Variant &p_variant) const;
|
bool hash_compare(const Variant &p_variant) const;
|
||||||
bool booleanize() const;
|
bool booleanize() const;
|
||||||
String stringify(List<const void *> &stack) const;
|
String stringify(List<const void *> &stack) const;
|
||||||
|
String to_json_string() const;
|
||||||
|
|
||||||
void static_assign(const Variant &p_variant);
|
void static_assign(const Variant &p_variant);
|
||||||
static void get_constants_for_type(Variant::Type p_type, List<StringName> *p_constants);
|
static void get_constants_for_type(Variant::Type p_type, List<StringName> *p_constants);
|
||||||
|
|
|
@ -1066,11 +1066,13 @@
|
||||||
<description>
|
<description>
|
||||||
Returns the internal type of the given Variant object, using the [enum Variant.Type] values.
|
Returns the internal type of the given Variant object, using the [enum Variant.Type] values.
|
||||||
[codeblock]
|
[codeblock]
|
||||||
p = parse_json('["a", "b", "c"]')
|
var json = JSON.new()
|
||||||
if typeof(p) == TYPE_ARRAY:
|
json.parse('["a", "b", "c"]')
|
||||||
print(p[0]) # Prints a
|
var result = json.get_data()
|
||||||
|
if typeof(result) == TYPE_ARRAY:
|
||||||
|
print(result[0]) # Prints a
|
||||||
else:
|
else:
|
||||||
print("unexpected results")
|
print("Unexpected result")
|
||||||
[/codeblock]
|
[/codeblock]
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
|
@ -1211,9 +1213,6 @@
|
||||||
<member name="InputMap" type="InputMap" setter="" getter="">
|
<member name="InputMap" type="InputMap" setter="" getter="">
|
||||||
The [InputMap] singleton.
|
The [InputMap] singleton.
|
||||||
</member>
|
</member>
|
||||||
<member name="JSON" type="JSON" setter="" getter="">
|
|
||||||
The [JSON] singleton.
|
|
||||||
</member>
|
|
||||||
<member name="JavaClassWrapper" type="JavaClassWrapper" setter="" getter="">
|
<member name="JavaClassWrapper" type="JavaClassWrapper" setter="" getter="">
|
||||||
The [JavaClassWrapper] singleton.
|
The [JavaClassWrapper] singleton.
|
||||||
[b]Note:[/b] Only implemented on Android.
|
[b]Note:[/b] Only implemented on Android.
|
||||||
|
|
|
@ -1,45 +1,88 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<class name="JSON" inherits="Object" version="4.0">
|
<class name="JSON" inherits="RefCounted" version="4.0">
|
||||||
<brief_description>
|
<brief_description>
|
||||||
Helper class for parsing JSON data.
|
Helper class for creating and parsing JSON data.
|
||||||
</brief_description>
|
</brief_description>
|
||||||
<description>
|
<description>
|
||||||
Helper class for parsing JSON data. For usage example and other important hints, see [JSONParseResult].
|
The [JSON] enables all data types to be converted to and from a JSON string. This useful for serializing data to save to a file or send over the network.
|
||||||
|
[method stringify] is used to convert any data type into a JSON string.
|
||||||
|
[method parse] is used to convert any existing JSON data into a [Variant] that can be used within Godot. If successfully parsed, use [method get_data] to retrieve the [Variant], and use [code]typeof[/code] to check if the Variant's type is what you expect. JSON Objects are converted into a [Dictionary], but JSON data can be used to store [Array]s, numbers, [String]s and even just a boolean.
|
||||||
|
[b]Example[/b]
|
||||||
|
[codeblock]
|
||||||
|
var data_to_send = ["a", "b", "c"]
|
||||||
|
var json = JSON.new()
|
||||||
|
var json_string = json.stringify(data_to_send)
|
||||||
|
# Save data
|
||||||
|
# ...
|
||||||
|
# Retrieve data
|
||||||
|
var error = json.parse(json_string)
|
||||||
|
if error == OK:
|
||||||
|
var data_received = json.get_data()
|
||||||
|
if typeof(data_received) == TYPE_ARRAY:
|
||||||
|
print(data_received) # Prints array
|
||||||
|
else:
|
||||||
|
print("Unexpected data")
|
||||||
|
else:
|
||||||
|
print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line())
|
||||||
|
[/codeblock]
|
||||||
</description>
|
</description>
|
||||||
<tutorials>
|
<tutorials>
|
||||||
</tutorials>
|
</tutorials>
|
||||||
<methods>
|
<methods>
|
||||||
<method name="parse">
|
<method name="get_data" qualifiers="const">
|
||||||
<return type="JSONParseResult">
|
<return type="Variant">
|
||||||
</return>
|
</return>
|
||||||
<argument index="0" name="json" type="String">
|
|
||||||
</argument>
|
|
||||||
<description>
|
<description>
|
||||||
Parses a JSON-encoded string and returns a [JSONParseResult] containing the result.
|
Returns the [Variant] containing the data of a successful [method parse].
|
||||||
|
[b]Note:[/b] It will return [code]Null[/code] if the last call to parse was unsuccessful or [method parse] has not yet been called.
|
||||||
</description>
|
</description>
|
||||||
</method>
|
</method>
|
||||||
<method name="print">
|
<method name="get_error_line" qualifiers="const">
|
||||||
|
<return type="int">
|
||||||
|
</return>
|
||||||
|
<description>
|
||||||
|
Returns [code]0[/code] if the last call to [method parse] was successful, or the line number where the parse failed.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="get_error_message" qualifiers="const">
|
||||||
<return type="String">
|
<return type="String">
|
||||||
</return>
|
</return>
|
||||||
<argument index="0" name="value" type="Variant">
|
<description>
|
||||||
|
Returns an empty string if the last call to [method parse] was successful, or the error message if it failed.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="parse">
|
||||||
|
<return type="int" enum="Error">
|
||||||
|
</return>
|
||||||
|
<argument index="0" name="json_string" type="String">
|
||||||
|
</argument>
|
||||||
|
<description>
|
||||||
|
Attempts to parse the [code]json_string[/code] provided.
|
||||||
|
Returns an [enum Error]. If the parse was successful, it returns [code]OK[/code] and the result can be retrieved using [method get_data]. If unsuccessful, use [method get_error_line] and [method get_error_message] for identifying the source of the failure.
|
||||||
|
</description>
|
||||||
|
</method>
|
||||||
|
<method name="stringify">
|
||||||
|
<return type="String">
|
||||||
|
</return>
|
||||||
|
<argument index="0" name="data" type="Variant">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="1" name="indent" type="String" default="""">
|
<argument index="1" name="indent" type="String" default="""">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="2" name="sort_keys" type="bool" default="false">
|
<argument index="2" name="sort_keys" type="bool" default="true">
|
||||||
</argument>
|
</argument>
|
||||||
<argument index="3" name="full_precision" type="bool" default="false">
|
<argument index="3" name="full_precision" type="bool" default="false">
|
||||||
</argument>
|
</argument>
|
||||||
<description>
|
<description>
|
||||||
Converts a [Variant] var to JSON text and returns the result. Useful for serializing data to store or send over the network.
|
Converts a [Variant] var to JSON text and returns the result. Useful for serializing data to store or send over the network.
|
||||||
[b]Note:[/b] The JSON specification does not define integer or float types, but only a [i]number[/i] type. Therefore, converting a Variant to JSON text will convert all numerical values to [float] types.
|
[b]Note:[/b] The JSON specification does not define integer or float types, but only a [i]number[/i] type. Therefore, converting a Variant to JSON text will convert all numerical values to [float] types.
|
||||||
[b]Note:[/b] If [code]full_precision[/code] is true, when printing floats, the unreliable digits are printed in addition to the reliable digits to guarantee exact decoding.
|
[b]Note:[/b] If [code]full_precision[/code] is true, when stringifying floats, the unreliable digits are stringified in addition to the reliable digits to guarantee exact decoding.
|
||||||
Use [code]indent[/code] parameter to pretty print the output.
|
Use [code]indent[/code] parameter to pretty stringify the output.
|
||||||
[b]Example output:[/b]
|
[b]Example output:[/b]
|
||||||
[codeblock]
|
[codeblock]
|
||||||
## JSON.print(my_dictionary)
|
## JSON.stringify(my_dictionary)
|
||||||
{"name":"my_dictionary","version":"1.0.0","entities":[{"name":"entity_0","value":"value_0"},{"name":"entity_1","value":"value_1"}]}
|
{"name":"my_dictionary","version":"1.0.0","entities":[{"name":"entity_0","value":"value_0"},{"name":"entity_1","value":"value_1"}]}
|
||||||
|
|
||||||
## JSON.print(my_dictionary, "\t")
|
## JSON.stringify(my_dictionary, "\t")
|
||||||
{
|
{
|
||||||
"name": "my_dictionary",
|
"name": "my_dictionary",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<class name="JSONParseResult" inherits="RefCounted" version="4.0">
|
|
||||||
<brief_description>
|
|
||||||
Data class wrapper for decoded JSON.
|
|
||||||
</brief_description>
|
|
||||||
<description>
|
|
||||||
Returned by [method JSON.parse], [JSONParseResult] contains the decoded JSON or error information if the JSON source wasn't successfully parsed. You can check if the JSON source was successfully parsed with [code]if json_result.error == OK[/code].
|
|
||||||
</description>
|
|
||||||
<tutorials>
|
|
||||||
</tutorials>
|
|
||||||
<methods>
|
|
||||||
</methods>
|
|
||||||
<members>
|
|
||||||
<member name="error" type="int" setter="set_error" getter="get_error" enum="Error">
|
|
||||||
The error type if the JSON source was not successfully parsed. See the [enum Error] constants.
|
|
||||||
</member>
|
|
||||||
<member name="error_line" type="int" setter="set_error_line" getter="get_error_line" default="-1">
|
|
||||||
The line number where the error occurred if the JSON source was not successfully parsed.
|
|
||||||
</member>
|
|
||||||
<member name="error_string" type="String" setter="set_error_string" getter="get_error_string" default="""">
|
|
||||||
The error message if the JSON source was not successfully parsed. See the [enum Error] constants.
|
|
||||||
</member>
|
|
||||||
<member name="result" type="Variant" setter="set_result" getter="get_result">
|
|
||||||
A [Variant] containing the parsed JSON. Use [method @GlobalScope.typeof] or the [code]is[/code] keyword to check if it is what you expect. For example, if the JSON source starts with curly braces ([code]{}[/code]), a [Dictionary] will be returned. If the JSON source starts with brackets ([code][][/code]), an [Array] will be returned.
|
|
||||||
[b]Note:[/b] The JSON specification does not define integer or float types, but only a [i]number[/i] type. Therefore, parsing a JSON text will convert all numerical values to [float] types.
|
|
||||||
[b]Note:[/b] JSON objects do not preserve key order like Godot dictionaries, thus, you should not rely on keys being in a certain order if a dictionary is constructed from JSON. In contrast, JSON arrays retain the order of their elements:
|
|
||||||
[codeblocks]
|
|
||||||
[gdscript]
|
|
||||||
var p = JSON.parse('["hello", "world", "!"]')
|
|
||||||
if typeof(p.result) == TYPE_ARRAY:
|
|
||||||
print(p.result[0]) # Prints "hello"
|
|
||||||
else:
|
|
||||||
push_error("Unexpected results.")
|
|
||||||
[/gdscript]
|
|
||||||
[csharp]
|
|
||||||
JSONParseResult p = JSON.Parse("[\"hello\"], \"world\", \"!\"]");
|
|
||||||
if (p.Result is Godot.Collections.Array)
|
|
||||||
{
|
|
||||||
GD.Print((p.Result as Godot.Collections.Array)[0]); // Prints "hello"
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GD.PushError("Unexpected results.");
|
|
||||||
}
|
|
||||||
[/csharp]
|
|
||||||
[/codeblocks]
|
|
||||||
</member>
|
|
||||||
</members>
|
|
||||||
<constants>
|
|
||||||
</constants>
|
|
||||||
</class>
|
|
|
@ -1,57 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
<class name="JSONParser" inherits="RefCounted" version="4.0">
|
|
||||||
<brief_description>
|
|
||||||
</brief_description>
|
|
||||||
<description>
|
|
||||||
</description>
|
|
||||||
<tutorials>
|
|
||||||
</tutorials>
|
|
||||||
<methods>
|
|
||||||
<method name="decode_data">
|
|
||||||
<return type="int" enum="Error">
|
|
||||||
</return>
|
|
||||||
<argument index="0" name="data" type="Variant">
|
|
||||||
</argument>
|
|
||||||
<argument index="1" name="indent" type="String" default="""">
|
|
||||||
</argument>
|
|
||||||
<argument index="2" name="sort_keys" type="bool" default="true">
|
|
||||||
</argument>
|
|
||||||
<description>
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_data" qualifiers="const">
|
|
||||||
<return type="Variant">
|
|
||||||
</return>
|
|
||||||
<description>
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_error_line" qualifiers="const">
|
|
||||||
<return type="int">
|
|
||||||
</return>
|
|
||||||
<description>
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_error_text" qualifiers="const">
|
|
||||||
<return type="String">
|
|
||||||
</return>
|
|
||||||
<description>
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="get_string" qualifiers="const">
|
|
||||||
<return type="String">
|
|
||||||
</return>
|
|
||||||
<description>
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
<method name="parse_string">
|
|
||||||
<return type="int" enum="Error">
|
|
||||||
</return>
|
|
||||||
<argument index="0" name="json_string" type="String">
|
|
||||||
</argument>
|
|
||||||
<description>
|
|
||||||
</description>
|
|
||||||
</method>
|
|
||||||
</methods>
|
|
||||||
<constants>
|
|
||||||
</constants>
|
|
||||||
</class>
|
|
|
@ -161,21 +161,21 @@ String EditorFeatureProfile::get_feature_description(Feature p_feature) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Error EditorFeatureProfile::save_to_file(const String &p_path) {
|
Error EditorFeatureProfile::save_to_file(const String &p_path) {
|
||||||
Dictionary json;
|
Dictionary data;
|
||||||
json["type"] = "feature_profile";
|
data["type"] = "feature_profile";
|
||||||
Array dis_classes;
|
Array dis_classes;
|
||||||
for (Set<StringName>::Element *E = disabled_classes.front(); E; E = E->next()) {
|
for (Set<StringName>::Element *E = disabled_classes.front(); E; E = E->next()) {
|
||||||
dis_classes.push_back(String(E->get()));
|
dis_classes.push_back(String(E->get()));
|
||||||
}
|
}
|
||||||
dis_classes.sort();
|
dis_classes.sort();
|
||||||
json["disabled_classes"] = dis_classes;
|
data["disabled_classes"] = dis_classes;
|
||||||
|
|
||||||
Array dis_editors;
|
Array dis_editors;
|
||||||
for (Set<StringName>::Element *E = disabled_editors.front(); E; E = E->next()) {
|
for (Set<StringName>::Element *E = disabled_editors.front(); E; E = E->next()) {
|
||||||
dis_editors.push_back(String(E->get()));
|
dis_editors.push_back(String(E->get()));
|
||||||
}
|
}
|
||||||
dis_editors.sort();
|
dis_editors.sort();
|
||||||
json["disabled_editors"] = dis_editors;
|
data["disabled_editors"] = dis_editors;
|
||||||
|
|
||||||
Array dis_props;
|
Array dis_props;
|
||||||
|
|
||||||
|
@ -185,7 +185,7 @@ Error EditorFeatureProfile::save_to_file(const String &p_path) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
json["disabled_properties"] = dis_props;
|
data["disabled_properties"] = dis_props;
|
||||||
|
|
||||||
Array dis_features;
|
Array dis_features;
|
||||||
for (int i = 0; i < FEATURE_MAX; i++) {
|
for (int i = 0; i < FEATURE_MAX; i++) {
|
||||||
|
@ -194,12 +194,13 @@ Error EditorFeatureProfile::save_to_file(const String &p_path) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
json["disabled_features"] = dis_features;
|
data["disabled_features"] = dis_features;
|
||||||
|
|
||||||
FileAccessRef f = FileAccess::open(p_path, FileAccess::WRITE);
|
FileAccessRef f = FileAccess::open(p_path, FileAccess::WRITE);
|
||||||
ERR_FAIL_COND_V_MSG(!f, ERR_CANT_CREATE, "Cannot create file '" + p_path + "'.");
|
ERR_FAIL_COND_V_MSG(!f, ERR_CANT_CREATE, "Cannot create file '" + p_path + "'.");
|
||||||
|
|
||||||
String text = JSON::print(json, "\t");
|
JSON json;
|
||||||
|
String text = json.stringify(data, "\t");
|
||||||
f->store_string(text);
|
f->store_string(text);
|
||||||
f->close();
|
f->close();
|
||||||
return OK;
|
return OK;
|
||||||
|
@ -212,26 +213,24 @@ Error EditorFeatureProfile::load_from_file(const String &p_path) {
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
String err_str;
|
JSON json;
|
||||||
int err_line;
|
err = json.parse(text);
|
||||||
Variant v;
|
|
||||||
err = JSON::parse(text, v, err_str, err_line);
|
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
ERR_PRINT("Error parsing '" + p_path + "' on line " + itos(err_line) + ": " + err_str);
|
ERR_PRINT("Error parsing '" + p_path + "' on line " + itos(json.get_error_line()) + ": " + json.get_error_message());
|
||||||
return ERR_PARSE_ERROR;
|
return ERR_PARSE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Dictionary json = v;
|
Dictionary data = json.get_data();
|
||||||
|
|
||||||
if (!json.has("type") || String(json["type"]) != "feature_profile") {
|
if (!data.has("type") || String(data["type"]) != "feature_profile") {
|
||||||
ERR_PRINT("Error parsing '" + p_path + "', it's not a feature profile.");
|
ERR_PRINT("Error parsing '" + p_path + "', it's not a feature profile.");
|
||||||
return ERR_PARSE_ERROR;
|
return ERR_PARSE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
disabled_classes.clear();
|
disabled_classes.clear();
|
||||||
|
|
||||||
if (json.has("disabled_classes")) {
|
if (data.has("disabled_classes")) {
|
||||||
Array disabled_classes_arr = json["disabled_classes"];
|
Array disabled_classes_arr = data["disabled_classes"];
|
||||||
for (int i = 0; i < disabled_classes_arr.size(); i++) {
|
for (int i = 0; i < disabled_classes_arr.size(); i++) {
|
||||||
disabled_classes.insert(disabled_classes_arr[i]);
|
disabled_classes.insert(disabled_classes_arr[i]);
|
||||||
}
|
}
|
||||||
|
@ -239,8 +238,8 @@ Error EditorFeatureProfile::load_from_file(const String &p_path) {
|
||||||
|
|
||||||
disabled_editors.clear();
|
disabled_editors.clear();
|
||||||
|
|
||||||
if (json.has("disabled_editors")) {
|
if (data.has("disabled_editors")) {
|
||||||
Array disabled_editors_arr = json["disabled_editors"];
|
Array disabled_editors_arr = data["disabled_editors"];
|
||||||
for (int i = 0; i < disabled_editors_arr.size(); i++) {
|
for (int i = 0; i < disabled_editors_arr.size(); i++) {
|
||||||
disabled_editors.insert(disabled_editors_arr[i]);
|
disabled_editors.insert(disabled_editors_arr[i]);
|
||||||
}
|
}
|
||||||
|
@ -248,16 +247,16 @@ Error EditorFeatureProfile::load_from_file(const String &p_path) {
|
||||||
|
|
||||||
disabled_properties.clear();
|
disabled_properties.clear();
|
||||||
|
|
||||||
if (json.has("disabled_properties")) {
|
if (data.has("disabled_properties")) {
|
||||||
Array disabled_properties_arr = json["disabled_properties"];
|
Array disabled_properties_arr = data["disabled_properties"];
|
||||||
for (int i = 0; i < disabled_properties_arr.size(); i++) {
|
for (int i = 0; i < disabled_properties_arr.size(); i++) {
|
||||||
String s = disabled_properties_arr[i];
|
String s = disabled_properties_arr[i];
|
||||||
set_disable_class_property(s.get_slice(":", 0), s.get_slice(":", 1), true);
|
set_disable_class_property(s.get_slice(":", 0), s.get_slice(":", 1), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (json.has("disabled_features")) {
|
if (data.has("disabled_features")) {
|
||||||
Array disabled_features_arr = json["disabled_features"];
|
Array disabled_features_arr = data["disabled_features"];
|
||||||
for (int i = 0; i < FEATURE_MAX; i++) {
|
for (int i = 0; i < FEATURE_MAX; i++) {
|
||||||
bool found = false;
|
bool found = false;
|
||||||
String f = feature_identifiers[i];
|
String f = feature_identifiers[i];
|
||||||
|
|
|
@ -242,10 +242,8 @@ void ExportTemplateManager::_refresh_mirrors_completed(int p_status, int p_code,
|
||||||
response_json.parse_utf8((const char *)r, p_data.size());
|
response_json.parse_utf8((const char *)r, p_data.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
Variant response;
|
JSON json;
|
||||||
String errs;
|
Error err = json.parse(response_json);
|
||||||
int errline;
|
|
||||||
Error err = JSON::parse(response_json, response, errs, errline);
|
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
EditorNode::get_singleton()->show_warning(TTR("Error parsing JSON with the list of mirrors. Please report this issue!"));
|
EditorNode::get_singleton()->show_warning(TTR("Error parsing JSON with the list of mirrors. Please report this issue!"));
|
||||||
is_refreshing_mirrors = false;
|
is_refreshing_mirrors = false;
|
||||||
|
@ -260,7 +258,7 @@ void ExportTemplateManager::_refresh_mirrors_completed(int p_status, int p_code,
|
||||||
|
|
||||||
mirrors_available = false;
|
mirrors_available = false;
|
||||||
|
|
||||||
Dictionary data = response;
|
Dictionary data = json.get_data();
|
||||||
if (data.has("mirrors")) {
|
if (data.has("mirrors")) {
|
||||||
Array mirrors = data["mirrors"];
|
Array mirrors = data["mirrors"];
|
||||||
|
|
||||||
|
|
|
@ -1098,11 +1098,9 @@ void EditorAssetLibrary::_http_request_completed(int p_status, int p_code, const
|
||||||
|
|
||||||
Dictionary d;
|
Dictionary d;
|
||||||
{
|
{
|
||||||
Variant js;
|
JSON json;
|
||||||
String errs;
|
json.parse(str);
|
||||||
int errl;
|
d = json.get_data();
|
||||||
JSON::parse(str, js, errs, errl);
|
|
||||||
d = js;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
RequestType requested = requesting;
|
RequestType requested = requesting;
|
||||||
|
|
|
@ -34,8 +34,7 @@
|
||||||
#ifdef TOOLS_ENABLED
|
#ifdef TOOLS_ENABLED
|
||||||
|
|
||||||
#include "core/io/file_access.h"
|
#include "core/io/file_access.h"
|
||||||
#include "core/io/json.h"
|
#include "core/string/print_string.h"
|
||||||
#include "core/string/ustring.h"
|
|
||||||
#include "core/templates/local_vector.h"
|
#include "core/templates/local_vector.h"
|
||||||
#include "core/templates/map.h"
|
#include "core/templates/map.h"
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
|
|
||||||
#include "../gdscript.h"
|
#include "../gdscript.h"
|
||||||
#include "../gdscript_analyzer.h"
|
#include "../gdscript_analyzer.h"
|
||||||
#include "core/io/json.h"
|
|
||||||
#include "gdscript_language_protocol.h"
|
#include "gdscript_language_protocol.h"
|
||||||
#include "gdscript_workspace.h"
|
#include "gdscript_workspace.h"
|
||||||
|
|
||||||
|
@ -183,7 +182,7 @@ void ExtendGDScriptParser::parse_class_symbol(const GDScriptParser::ClassNode *p
|
||||||
symbol.detail += ": " + m.get_datatype().to_string();
|
symbol.detail += ": " + m.get_datatype().to_string();
|
||||||
}
|
}
|
||||||
if (m.variable->initializer != nullptr && m.variable->initializer->is_constant) {
|
if (m.variable->initializer != nullptr && m.variable->initializer->is_constant) {
|
||||||
symbol.detail += " = " + JSON::print(m.variable->initializer->reduced_value);
|
symbol.detail += " = " + m.variable->initializer->reduced_value.to_json_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
symbol.documentation = parse_documentation(LINE_NUMBER_TO_INDEX(m.variable->start_line));
|
symbol.documentation = parse_documentation(LINE_NUMBER_TO_INDEX(m.variable->start_line));
|
||||||
|
@ -224,10 +223,10 @@ void ExtendGDScriptParser::parse_class_symbol(const GDScriptParser::ClassNode *p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
value_text = JSON::print(default_value);
|
value_text = default_value.to_json_string();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
value_text = JSON::print(default_value);
|
value_text = default_value.to_json_string();
|
||||||
}
|
}
|
||||||
if (!value_text.is_empty()) {
|
if (!value_text.is_empty()) {
|
||||||
symbol.detail += " = " + value_text;
|
symbol.detail += " = " + value_text;
|
||||||
|
@ -353,8 +352,7 @@ void ExtendGDScriptParser::parse_function_symbol(const GDScriptParser::FunctionN
|
||||||
parameters += ": " + parameter->get_datatype().to_string();
|
parameters += ": " + parameter->get_datatype().to_string();
|
||||||
}
|
}
|
||||||
if (parameter->default_value != nullptr) {
|
if (parameter->default_value != nullptr) {
|
||||||
String value = JSON::print(parameter->default_value->reduced_value);
|
parameters += " = " + parameter->default_value->reduced_value.to_json_string();
|
||||||
parameters += " = " + value;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
r_symbol.detail += parameters + ")";
|
r_symbol.detail += parameters + ")";
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include "gdscript_language_protocol.h"
|
#include "gdscript_language_protocol.h"
|
||||||
|
|
||||||
#include "core/config/project_settings.h"
|
#include "core/config/project_settings.h"
|
||||||
#include "core/io/json.h"
|
|
||||||
#include "editor/doc_tools.h"
|
#include "editor/doc_tools.h"
|
||||||
#include "editor/editor_log.h"
|
#include "editor/editor_log.h"
|
||||||
#include "editor/editor_node.h"
|
#include "editor/editor_node.h"
|
||||||
|
@ -194,7 +193,7 @@ Dictionary GDScriptLanguageProtocol::initialize(const Dictionary &p_params) {
|
||||||
vformat("GDScriptLanguageProtocol: Can't initialize invalid peer '%d'.", latest_client_id));
|
vformat("GDScriptLanguageProtocol: Can't initialize invalid peer '%d'.", latest_client_id));
|
||||||
Ref<LSPeer> peer = clients.get(latest_client_id);
|
Ref<LSPeer> peer = clients.get(latest_client_id);
|
||||||
if (peer != nullptr) {
|
if (peer != nullptr) {
|
||||||
String msg = JSON::print(request);
|
String msg = Variant(request).to_json_string();
|
||||||
msg = format_output(msg);
|
msg = format_output(msg);
|
||||||
(*peer)->res_queue.push_back(msg.utf8());
|
(*peer)->res_queue.push_back(msg.utf8());
|
||||||
}
|
}
|
||||||
|
@ -280,7 +279,7 @@ void GDScriptLanguageProtocol::notify_client(const String &p_method, const Varia
|
||||||
ERR_FAIL_COND(peer == nullptr);
|
ERR_FAIL_COND(peer == nullptr);
|
||||||
|
|
||||||
Dictionary message = make_notification(p_method, p_params);
|
Dictionary message = make_notification(p_method, p_params);
|
||||||
String msg = JSON::print(message);
|
String msg = Variant(message).to_json_string();
|
||||||
msg = format_output(msg);
|
msg = format_output(msg);
|
||||||
peer->res_queue.push_back(msg.utf8());
|
peer->res_queue.push_back(msg.utf8());
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
|
|
||||||
#include "core/crypto/crypto_core.h"
|
#include "core/crypto/crypto_core.h"
|
||||||
#include "core/io/file_access.h"
|
#include "core/io/file_access.h"
|
||||||
#include "core/io/json.h"
|
|
||||||
#include "core/math/disjoint_set.h"
|
#include "core/math/disjoint_set.h"
|
||||||
#include "core/math/math_defs.h"
|
#include "core/math/math_defs.h"
|
||||||
#include "core/os/os.h"
|
#include "core/os/os.h"
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
#define EDITOR_SCENE_IMPORTER_GLTF_H
|
#define EDITOR_SCENE_IMPORTER_GLTF_H
|
||||||
|
|
||||||
#include "core/config/project_settings.h"
|
#include "core/config/project_settings.h"
|
||||||
#include "core/io/json.h"
|
|
||||||
#include "core/object/object.h"
|
#include "core/object/object.h"
|
||||||
#include "core/templates/vector.h"
|
#include "core/templates/vector.h"
|
||||||
#include "editor/import/resource_importer_scene.h"
|
#include "editor/import/resource_importer_scene.h"
|
||||||
|
|
|
@ -238,15 +238,13 @@ Error GLTFDocument::_parse_json(const String &p_path, Ref<GLTFState> state) {
|
||||||
String text;
|
String text;
|
||||||
text.parse_utf8((const char *)array.ptr(), array.size());
|
text.parse_utf8((const char *)array.ptr(), array.size());
|
||||||
|
|
||||||
String err_txt;
|
JSON json;
|
||||||
int err_line;
|
err = json.parse(text);
|
||||||
Variant v;
|
|
||||||
err = JSON::parse(text, v, err_txt, err_line);
|
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
_err_print_error("", p_path.utf8().get_data(), err_line, err_txt.utf8().get_data(), ERR_HANDLER_SCRIPT);
|
_err_print_error("", p_path.utf8().get_data(), json.get_error_line(), json.get_error_message().utf8().get_data(), ERR_HANDLER_SCRIPT);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
state->json = v;
|
state->json = json.get_data();
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
|
@ -299,16 +297,14 @@ Error GLTFDocument::_parse_glb(const String &p_path, Ref<GLTFState> state) {
|
||||||
String text;
|
String text;
|
||||||
text.parse_utf8((const char *)json_data.ptr(), json_data.size());
|
text.parse_utf8((const char *)json_data.ptr(), json_data.size());
|
||||||
|
|
||||||
String err_txt;
|
JSON json;
|
||||||
int err_line;
|
err = json.parse(text);
|
||||||
Variant v;
|
|
||||||
err = JSON::parse(text, v, err_txt, err_line);
|
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
_err_print_error("", p_path.utf8().get_data(), err_line, err_txt.utf8().get_data(), ERR_HANDLER_SCRIPT);
|
_err_print_error("", p_path.utf8().get_data(), json.get_error_line(), json.get_error_message().utf8().get_data(), ERR_HANDLER_SCRIPT);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
state->json = v;
|
state->json = json.get_data();
|
||||||
|
|
||||||
//data?
|
//data?
|
||||||
|
|
||||||
|
@ -6584,7 +6580,7 @@ Error GLTFDocument::_serialize_file(Ref<GLTFState> state, const String p_path) {
|
||||||
FileAccessRef f = FileAccess::open(p_path, FileAccess::WRITE, &err);
|
FileAccessRef f = FileAccess::open(p_path, FileAccess::WRITE, &err);
|
||||||
ERR_FAIL_COND_V(!f, FAILED);
|
ERR_FAIL_COND_V(!f, FAILED);
|
||||||
|
|
||||||
String json = JSON::print(state->json);
|
String json = Variant(state->json).to_json_string();
|
||||||
|
|
||||||
const uint32_t magic = 0x46546C67; // GLTF
|
const uint32_t magic = 0x46546C67; // GLTF
|
||||||
const int32_t header_size = 12;
|
const int32_t header_size = 12;
|
||||||
|
@ -6625,7 +6621,7 @@ Error GLTFDocument::_serialize_file(Ref<GLTFState> state, const String p_path) {
|
||||||
ERR_FAIL_COND_V(!f, FAILED);
|
ERR_FAIL_COND_V(!f, FAILED);
|
||||||
|
|
||||||
f->create(FileAccess::ACCESS_RESOURCES);
|
f->create(FileAccess::ACCESS_RESOURCES);
|
||||||
String json = JSON::print(state->json);
|
String json = Variant(state->json).to_json_string();
|
||||||
f->store_string(json);
|
f->store_string(json);
|
||||||
f->close();
|
f->close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
#include "jsonrpc.h"
|
#include "jsonrpc.h"
|
||||||
|
|
||||||
#include "core/io/json.h"
|
#include "core/io/json.h"
|
||||||
|
|
||||||
JSONRPC::JSONRPC() {
|
JSONRPC::JSONRPC() {
|
||||||
|
@ -156,19 +157,17 @@ String JSONRPC::process_string(const String &p_input) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Variant ret;
|
Variant ret;
|
||||||
Variant input;
|
JSON json;
|
||||||
String err_message;
|
if (json.parse(p_input) == OK) {
|
||||||
int err_line;
|
ret = process_action(json.get_data(), true);
|
||||||
if (OK != JSON::parse(p_input, input, err_message, err_line)) {
|
|
||||||
ret = make_response_error(JSONRPC::PARSE_ERROR, "Parse error");
|
|
||||||
} else {
|
} else {
|
||||||
ret = process_action(input, true);
|
ret = make_response_error(JSONRPC::PARSE_ERROR, "Parse error");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret.get_type() == Variant::NIL) {
|
if (ret.get_type() == Variant::NIL) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
return JSON::print(ret);
|
return ret.to_json_string();
|
||||||
}
|
}
|
||||||
|
|
||||||
void JSONRPC::set_scope(const String &p_scope, Object *p_obj) {
|
void JSONRPC::set_scope(const String &p_scope, Object *p_obj) {
|
||||||
|
|
|
@ -240,7 +240,8 @@ void class_db_api_to_json(const String &p_output_file, ClassDB::APIType p_api) {
|
||||||
|
|
||||||
FileAccessRef f = FileAccess::open(p_output_file, FileAccess::WRITE);
|
FileAccessRef f = FileAccess::open(p_output_file, FileAccess::WRITE);
|
||||||
ERR_FAIL_COND_MSG(!f, "Cannot open file '" + p_output_file + "'.");
|
ERR_FAIL_COND_MSG(!f, "Cannot open file '" + p_output_file + "'.");
|
||||||
f->store_string(JSON::print(classes_dict, /*indent: */ "\t"));
|
JSON json;
|
||||||
|
f->store_string(json.stringify(classes_dict, "\t"));
|
||||||
f->close();
|
f->close();
|
||||||
|
|
||||||
print_line(String() + "ClassDB API JSON written to: " + ProjectSettings::get_singleton()->globalize_path(p_output_file));
|
print_line(String() + "ClassDB API JSON written to: " + ProjectSettings::get_singleton()->globalize_path(p_output_file));
|
||||||
|
|
|
@ -38,7 +38,6 @@
|
||||||
#include "core/debugger/engine_debugger.h"
|
#include "core/debugger/engine_debugger.h"
|
||||||
#include "core/debugger/script_debugger.h"
|
#include "core/debugger/script_debugger.h"
|
||||||
#include "core/io/file_access.h"
|
#include "core/io/file_access.h"
|
||||||
#include "core/io/json.h"
|
|
||||||
#include "core/os/mutex.h"
|
#include "core/os/mutex.h"
|
||||||
#include "core/os/os.h"
|
#include "core/os/os.h"
|
||||||
#include "core/os/thread.h"
|
#include "core/os/thread.h"
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
#include "core/io/image_loader.h"
|
#include "core/io/image_loader.h"
|
||||||
#include "core/io/json.h"
|
|
||||||
#include "core/io/stream_peer_ssl.h"
|
#include "core/io/stream_peer_ssl.h"
|
||||||
#include "core/io/tcp_server.h"
|
#include "core/io/tcp_server.h"
|
||||||
#include "core/io/zip_io.h"
|
#include "core/io/zip_io.h"
|
||||||
|
@ -465,7 +464,7 @@ void EditorExportPlatformJavaScript::_fix_html(Vector<uint8_t> &p_html, const Re
|
||||||
}
|
}
|
||||||
|
|
||||||
// Replaces HTML string
|
// Replaces HTML string
|
||||||
const String str_config = JSON::print(config);
|
const String str_config = Variant(config).to_json_string();
|
||||||
const String custom_head_include = p_preset->get("html/head_include");
|
const String custom_head_include = p_preset->get("html/head_include");
|
||||||
Map<String, String> replaces;
|
Map<String, String> replaces;
|
||||||
replaces["$GODOT_URL"] = p_name + ".js";
|
replaces["$GODOT_URL"] = p_name + ".js";
|
||||||
|
@ -518,7 +517,7 @@ Error EditorExportPlatformJavaScript::_build_pwa(const Ref<EditorExportPreset> &
|
||||||
replaces["@GODOT_NAME@"] = name;
|
replaces["@GODOT_NAME@"] = name;
|
||||||
replaces["@GODOT_OFFLINE_PAGE@"] = name + ".offline.html";
|
replaces["@GODOT_OFFLINE_PAGE@"] = name + ".offline.html";
|
||||||
Array files;
|
Array files;
|
||||||
replaces["@GODOT_OPT_CACHE@"] = JSON::print(files);
|
replaces["@GODOT_OPT_CACHE@"] = Variant(files).to_json_string();
|
||||||
files.push_back(name + ".html");
|
files.push_back(name + ".html");
|
||||||
files.push_back(name + ".js");
|
files.push_back(name + ".js");
|
||||||
files.push_back(name + ".wasm");
|
files.push_back(name + ".wasm");
|
||||||
|
@ -537,7 +536,7 @@ Error EditorExportPlatformJavaScript::_build_pwa(const Ref<EditorExportPreset> &
|
||||||
files.push_back(p_shared_objects[i].path.get_file());
|
files.push_back(p_shared_objects[i].path.get_file());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
replaces["@GODOT_CACHE@"] = JSON::print(files);
|
replaces["@GODOT_CACHE@"] = Variant(files).to_json_string();
|
||||||
|
|
||||||
const String sw_path = dir.plus_file(name + ".service.worker.js");
|
const String sw_path = dir.plus_file(name + ".service.worker.js");
|
||||||
Vector<uint8_t> sw;
|
Vector<uint8_t> sw;
|
||||||
|
@ -605,7 +604,7 @@ Error EditorExportPlatformJavaScript::_build_pwa(const Ref<EditorExportPreset> &
|
||||||
}
|
}
|
||||||
manifest["icons"] = icons_arr;
|
manifest["icons"] = icons_arr;
|
||||||
|
|
||||||
CharString cs = JSON::print(manifest).utf8();
|
CharString cs = Variant(manifest).to_json_string().utf8();
|
||||||
err = _write_or_error((const uint8_t *)cs.get_data(), cs.length(), dir.plus_file(name + ".manifest.json"));
|
err = _write_or_error((const uint8_t *)cs.get_data(), cs.length(), dir.plus_file(name + ".manifest.json"));
|
||||||
if (err != OK) {
|
if (err != OK) {
|
||||||
return err;
|
return err;
|
||||||
|
|
|
@ -45,75 +45,65 @@ TEST_CASE("[JSON] Parsing single data types") {
|
||||||
// Parsing a single data type as JSON is valid per the JSON specification.
|
// Parsing a single data type as JSON is valid per the JSON specification.
|
||||||
|
|
||||||
JSON json;
|
JSON json;
|
||||||
Variant result;
|
|
||||||
String err_str;
|
|
||||||
int err_line;
|
|
||||||
|
|
||||||
json.parse("null", result, err_str, err_line);
|
json.parse("null");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
err_line == 0,
|
json.get_error_line() == 0,
|
||||||
"Parsing `null` as JSON should parse successfully.");
|
"Parsing `null` as JSON should parse successfully.");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
result == Variant(),
|
json.get_data() == Variant(),
|
||||||
"Parsing a double quoted string as JSON should return the expected value.");
|
"Parsing a double quoted string as JSON should return the expected value.");
|
||||||
|
|
||||||
json.parse("true", result, err_str, err_line);
|
json.parse("true");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
err_line == 0,
|
json.get_error_line() == 0,
|
||||||
"Parsing boolean `true` as JSON should parse successfully.");
|
"Parsing boolean `true` as JSON should parse successfully.");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
result,
|
json.get_data(),
|
||||||
"Parsing boolean `true` as JSON should return the expected value.");
|
"Parsing boolean `true` as JSON should return the expected value.");
|
||||||
|
|
||||||
json.parse("false", result, err_str, err_line);
|
json.parse("false");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
err_line == 0,
|
json.get_error_line() == 0,
|
||||||
"Parsing boolean `false` as JSON should parse successfully.");
|
"Parsing boolean `false` as JSON should parse successfully.");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
!result,
|
!json.get_data(),
|
||||||
"Parsing boolean `false` as JSON should return the expected value.");
|
"Parsing boolean `false` as JSON should return the expected value.");
|
||||||
|
|
||||||
// JSON only has a floating-point number type, no integer type.
|
json.parse("123456");
|
||||||
// This is why we use `is_equal_approx()` for the comparison.
|
|
||||||
json.parse("123456", result, err_str, err_line);
|
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
err_line == 0,
|
json.get_error_line() == 0,
|
||||||
"Parsing an integer number as JSON should parse successfully.");
|
"Parsing an integer number as JSON should parse successfully.");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
(int)result == 123'456,
|
(int)(json.get_data()) == 123456,
|
||||||
"Parsing an integer number as JSON should return the expected value.");
|
"Parsing an integer number as JSON should return the expected value.");
|
||||||
|
|
||||||
json.parse("0.123456", result, err_str, err_line);
|
json.parse("0.123456");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
err_line == 0,
|
json.get_error_line() == 0,
|
||||||
"Parsing a floating-point number as JSON should parse successfully.");
|
"Parsing a floating-point number as JSON should parse successfully.");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
Math::is_equal_approx(result, 0.123456),
|
Math::is_equal_approx(json.get_data(), 0.123456),
|
||||||
"Parsing a floating-point number as JSON should return the expected value.");
|
"Parsing a floating-point number as JSON should return the expected value.");
|
||||||
|
|
||||||
json.parse("\"hello\"", result, err_str, err_line);
|
json.parse("\"hello\"");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
err_line == 0,
|
json.get_error_line() == 0,
|
||||||
"Parsing a double quoted string as JSON should parse successfully.");
|
"Parsing a double quoted string as JSON should parse successfully.");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
result == "hello",
|
json.get_data() == "hello",
|
||||||
"Parsing a double quoted string as JSON should return the expected value.");
|
"Parsing a double quoted string as JSON should return the expected value.");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("[JSON] Parsing arrays") {
|
TEST_CASE("[JSON] Parsing arrays") {
|
||||||
JSON json;
|
JSON json;
|
||||||
Variant result;
|
|
||||||
String err_str;
|
|
||||||
int err_line;
|
|
||||||
|
|
||||||
// JSON parsing fails if it's split over several lines (even if leading indentation is removed).
|
// JSON parsing fails if it's split over several lines (even if leading indentation is removed).
|
||||||
json.parse(
|
json.parse(R"(["Hello", "world.", "This is",["a","json","array.",[]], "Empty arrays ahoy:", [[["Gotcha!"]]]])");
|
||||||
R"(["Hello", "world.", "This is",["a","json","array.",[]], "Empty arrays ahoy:", [[["Gotcha!"]]]])",
|
|
||||||
result, err_str, err_line);
|
|
||||||
|
|
||||||
const Array array = result;
|
const Array array = json.get_data();
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
err_line == 0,
|
json.get_error_line() == 0,
|
||||||
"Parsing a JSON array should parse successfully.");
|
"Parsing a JSON array should parse successfully.");
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
array[0] == "Hello",
|
array[0] == "Hello",
|
||||||
|
@ -136,15 +126,10 @@ TEST_CASE("[JSON] Parsing arrays") {
|
||||||
|
|
||||||
TEST_CASE("[JSON] Parsing objects (dictionaries)") {
|
TEST_CASE("[JSON] Parsing objects (dictionaries)") {
|
||||||
JSON json;
|
JSON json;
|
||||||
Variant result;
|
|
||||||
String err_str;
|
|
||||||
int err_line;
|
|
||||||
|
|
||||||
json.parse(
|
json.parse(R"({"name": "Godot Engine", "is_free": true, "bugs": null, "apples": {"red": 500, "green": 0, "blue": -20}, "empty_object": {}})");
|
||||||
R"({"name": "Godot Engine", "is_free": true, "bugs": null, "apples": {"red": 500, "green": 0, "blue": -20}, "empty_object": {}})",
|
|
||||||
result, err_str, err_line);
|
|
||||||
|
|
||||||
const Dictionary dictionary = result;
|
const Dictionary dictionary = json.get_data();
|
||||||
CHECK_MESSAGE(
|
CHECK_MESSAGE(
|
||||||
dictionary["name"] == "Godot Engine",
|
dictionary["name"] == "Godot Engine",
|
||||||
"The parsed JSON should contain the expected values.");
|
"The parsed JSON should contain the expected values.");
|
||||||
|
|
Loading…
Reference in a new issue