You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-09 12:50:35 +00:00
Treat JSON as resource files.
This makes the files ended in ".json" be treated as Godot resources. This solves two problems: * Avoid extensions to implement their own handling, which results in conflicts (all must use this one). * Allow code to still work opening it as a file (since it will not be imported).
This commit is contained in:
@@ -497,6 +497,10 @@ Error JSON::_parse_object(Dictionary &object, const char32_t *p_str, int &index,
|
||||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
||||
void JSON::set_data(const Variant &p_data) {
|
||||
data = p_data;
|
||||
}
|
||||
|
||||
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();
|
||||
int idx = 0;
|
||||
@@ -557,6 +561,88 @@ void JSON::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("parse", "json_string"), &JSON::parse);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_data"), &JSON::get_data);
|
||||
ClassDB::bind_method(D_METHOD("set_data", "data"), &JSON::set_data);
|
||||
ClassDB::bind_method(D_METHOD("get_error_line"), &JSON::get_error_line);
|
||||
ClassDB::bind_method(D_METHOD("get_error_message"), &JSON::get_error_message);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::NIL, "data", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_NIL_IS_VARIANT), "set_data", "get_data"); // Ensures that it can be serialized as binary.
|
||||
}
|
||||
|
||||
////
|
||||
|
||||
////////////
|
||||
|
||||
Ref<Resource> ResourceFormatLoaderJSON::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) {
|
||||
if (r_error) {
|
||||
*r_error = ERR_FILE_CANT_OPEN;
|
||||
}
|
||||
|
||||
if (!FileAccess::exists(p_path)) {
|
||||
*r_error = ERR_FILE_NOT_FOUND;
|
||||
return Ref<Resource>();
|
||||
}
|
||||
|
||||
Ref<JSON> json;
|
||||
json.instantiate();
|
||||
|
||||
Error err = json->parse(FileAccess::get_file_as_string(p_path));
|
||||
if (err != OK) {
|
||||
if (r_error) {
|
||||
*r_error = err;
|
||||
}
|
||||
ERR_PRINT("Error parsing JSON file at '" + p_path + "', on line " + itos(json->get_error_line()) + ": " + json->get_error_message());
|
||||
return Ref<Resource>();
|
||||
}
|
||||
|
||||
if (r_error) {
|
||||
*r_error = OK;
|
||||
}
|
||||
|
||||
return json;
|
||||
}
|
||||
|
||||
void ResourceFormatLoaderJSON::get_recognized_extensions(List<String> *p_extensions) const {
|
||||
p_extensions->push_back("json");
|
||||
}
|
||||
|
||||
bool ResourceFormatLoaderJSON::handles_type(const String &p_type) const {
|
||||
return (p_type == "JSON");
|
||||
}
|
||||
|
||||
String ResourceFormatLoaderJSON::get_resource_type(const String &p_path) const {
|
||||
String el = p_path.get_extension().to_lower();
|
||||
if (el == "json") {
|
||||
return "JSON";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
Error ResourceFormatSaverJSON::save(const Ref<Resource> &p_resource, const String &p_path, uint32_t p_flags) {
|
||||
Ref<JSON> json = p_resource;
|
||||
ERR_FAIL_COND_V(json.is_null(), ERR_INVALID_PARAMETER);
|
||||
|
||||
String source = JSON::stringify(json->get_data(), "\t", false, true);
|
||||
|
||||
Error err;
|
||||
Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::WRITE, &err);
|
||||
|
||||
ERR_FAIL_COND_V_MSG(err, err, "Cannot save json '" + p_path + "'.");
|
||||
|
||||
file->store_string(source);
|
||||
if (file->get_error() != OK && file->get_error() != ERR_FILE_EOF) {
|
||||
return ERR_CANT_CREATE;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
void ResourceFormatSaverJSON::get_recognized_extensions(const Ref<Resource> &p_resource, List<String> *p_extensions) const {
|
||||
Ref<JSON> json = p_resource;
|
||||
if (json.is_valid()) {
|
||||
p_extensions->push_back("json");
|
||||
}
|
||||
}
|
||||
|
||||
bool ResourceFormatSaverJSON::recognize(const Ref<Resource> &p_resource) const {
|
||||
return p_resource->get_class_name() == "JSON"; //only json, not inherited
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user