Selaa lähdekoodia

Make JSON methods static

kobewi 3 vuotta sitten
vanhempi
commit
5947f688fb
3 muutettua tiedostoa jossa 33 lisäystä ja 10 poistoa
  1. 17 6
      core/io/json.cpp
  2. 2 1
      core/io/json.h
  3. 14 3
      doc/classes/JSON.xml

+ 17 - 6
core/io/json.cpp

@@ -528,11 +528,6 @@ Error JSON::_parse_string(const String &p_json, Variant &r_ret, String &r_err_st
 	return err;
 }
 
-String JSON::stringify(const Variant &p_var, const String &p_indent, bool p_sort_keys, bool p_full_precision) {
-	HashSet<const void *> markers;
-	return _stringify(p_var, p_indent, 0, p_sort_keys, markers, p_full_precision);
-}
-
 Error JSON::parse(const String &p_json_string) {
 	Error err = _parse_string(p_json_string, data, err_str, err_line);
 	if (err == Error::OK) {
@@ -541,8 +536,24 @@ Error JSON::parse(const String &p_json_string) {
 	return err;
 }
 
+String JSON::stringify(const Variant &p_var, const String &p_indent, bool p_sort_keys, bool p_full_precision) {
+	Ref<JSON> jason;
+	jason.instantiate();
+	HashSet<const void *> markers;
+	return jason->_stringify(p_var, p_indent, 0, p_sort_keys, markers, p_full_precision);
+}
+
+Variant JSON::parse_string(const String &p_json_string) {
+	Ref<JSON> jason;
+	jason.instantiate();
+	Error error = jason->parse(p_json_string);
+	ERR_FAIL_COND_V_MSG(error != Error::OK, Variant(), vformat("Parse JSON failed. Error at line %d: %s", jason->get_error_line(), jason->get_error_message()));
+	return jason->get_data();
+}
+
 void JSON::_bind_methods() {
-	ClassDB::bind_method(D_METHOD("stringify", "data", "indent", "sort_keys", "full_precision"), &JSON::stringify, DEFVAL(""), DEFVAL(true), DEFVAL(false));
+	ClassDB::bind_static_method("JSON", D_METHOD("stringify", "data", "indent", "sort_keys", "full_precision"), &JSON::stringify, DEFVAL(""), DEFVAL(true), DEFVAL(false));
+	ClassDB::bind_static_method("JSON", D_METHOD("parse_string", "json_string"), &JSON::parse_string);
 	ClassDB::bind_method(D_METHOD("parse", "json_string"), &JSON::parse);
 
 	ClassDB::bind_method(D_METHOD("get_data"), &JSON::get_data);

+ 2 - 1
core/io/json.h

@@ -81,8 +81,9 @@ protected:
 	static void _bind_methods();
 
 public:
-	String stringify(const Variant &p_var, const String &p_indent = "", bool p_sort_keys = true, bool p_full_precision = false);
 	Error parse(const String &p_json_string);
+	static String stringify(const Variant &p_var, const String &p_indent = "", bool p_sort_keys = true, bool p_full_precision = false);
+	static Variant parse_string(const String &p_json_string);
 
 	inline Variant get_data() const { return data; }
 	inline int get_error_line() const { return err_line; }

+ 14 - 3
doc/classes/JSON.xml

@@ -10,8 +10,7 @@
 		[b]Example[/b]
 		[codeblock]
 		var data_to_send = ["a", "b", "c"]
-		var json = JSON.new()
-		var json_string = json.stringify(data_to_send)
+		var json_string = JSON.stringify(data_to_send)
 		# Save data
 		# ...
 		# Retrieve data
@@ -25,6 +24,10 @@
 		else:
 		    print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line())
 		[/codeblock]
+		Alternatively, you can parse string using the static [method parse_string] method, but it doesn't allow to handle errors.
+		[codeblock]
+		var data = JSON.parse_string(json_string) # Returns null if parsing failed.
+		[/codeblock]
 	</description>
 	<tutorials>
 	</tutorials>
@@ -54,9 +57,17 @@
 			<description>
 				Attempts to parse the [param json_string] 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.
+				Non-static variant of [method parse_string], if you want custom error handling.
+			</description>
+		</method>
+		<method name="parse_string" qualifiers="static">
+			<return type="Variant" />
+			<param index="0" name="json_string" type="String" />
+			<description>
+				Attempts to parse the [param json_string] provided and returns the parsed data. Returns [code]null[/code] if parse failed.
 			</description>
 		</method>
-		<method name="stringify">
+		<method name="stringify" qualifiers="static">
 			<return type="String" />
 			<param index="0" name="data" type="Variant" />
 			<param index="1" name="indent" type="String" default="&quot;&quot;" />