JSON¶
继承: Resource < RefCounted < Object
用于创建和解析JSON数据的助手类。
描述¶
JSON类允许将所有数据类型转换为JSON字符串,反之亦然。这对于序列化数据很有用,例如保存到文件或通过网络发送。
stringify()用于将任何数据类型转换为JSON字符串。
parse()用于将任何现有的JSON数据转换为Variant,可在i3D中使用。如果解析成功,请使用data检索Variant,并使用@GlobalScope.typeof()检查Variant的类型是否符合预期。JSON对象被转换为Dictionary,但JSON数据可用于存储Array、数字、String,甚至是布尔值。
var data_to_send = ["a", "b", "c"]
var json_string = JSON.stringify(data_to_send)
# 保存数据
# ...
# 检索数据
var json = JSON.new()
var error = json.parse(json_string)
if error == OK:
var data_received = json.data
if typeof(data_received) == TYPE_ARRAY:
print(data_received) # Prints the array.
else:
print("Unexpected data")
else:
print("JSON Parse Error: ", json.get_error_message(), " in ", json_string, " at line ", json.get_error_line())
或者,您可以使用静态方法 parse_string() 来解析字符串,但该方法不处理错误.
var data = JSON.parse_string(json_string) # 解析失败则返回 null.
注意:两种解析方法都不完全符合JSON规范:
-忽略数组或对象中的尾随逗号,而不是导致解析器错误。
-字符串文字中接受新行和制表符,并将其视为对应的转义序列\n和\t。
-使用String.to_float()解析数字,这通常比JSON规范更宽松。
-某些错误,例如无效的Unicode序列,不会导致解析器错误。相反,字符串会被清理并将错误记录到控制台。
属性¶
方法¶
from_native(variant: Variant, full_objects: bool = false) static |
|
get_error_line() const |
|
get_error_message() const |
|
get_parsed_text() const |
|
parse_string(json_string: String) static |
|
stringify(data: Variant, indent: String = "", sort_keys: bool = true, full_precision: bool = false) static |
|
to_native(json: Variant, allow_objects: bool = false) static |
属性说明¶
包含Variant形式的已解析JSON数据。
方法说明¶
Variant from_native(variant: Variant, full_objects: bool = false) static 🔗
将原生引擎类型转换为符合JSON的值。
默认情况下,出于安全考虑,忽略对象,除非full_objects为true。
您可以将原生值转换为JSON字符串,例如:
func encode_data(value, full_objects = false):
return JSON.stringify(JSON.from_native(value, full_objects))
如果最后一次调用parse()成功,或解析失败的行号,则返回0。
String get_error_message() const 🔗
如果最后一次调用parse()成功,则返回一个空字符串,如果失败,则返回错误消息。
String get_parsed_text() const 🔗
返回parse()解析的文本(需要将keep_text传递给parse())。
Error parse(json_text: String, keep_text: bool = false) 🔗
尝试解析提供的json_text。
返回Error。如果解析成功,则返回@GlobalScope.OK,并且可以使用data检索结果。如果不成功,则使用get_error_line()和get_error_message()来识别失败的来源。
parse_string()的非静态变体,如果需要自定义错误处理。
可选的keep_text参数指示解析器保留原始文本的副本,该文本可以稍后通过使用get_parsed_text()函数获得,并在保存资源时使用(而不是从data生成新文本)。
Variant parse_string(json_string: String) static 🔗
尝试解析提供的json_string并返回解析后的数据。如果解析失败,则返回null。
String stringify(data: Variant, indent: String = "", sort_keys: bool = true, full_precision: bool = false) static 🔗
将Variantvar转换为JSON文本并返回结果。用于序列化数据以存储或通过网络发送。
注意:JSON规范没有定义整数或浮点类型,而只定义了number类型。因此,将Variant转换为JSON文本时,所有数值都将被转换为float类型。
注意:如果full_precision是true,当字符串化浮点数时,除了可靠数字之外,还会字符串化不可靠的数字,以保证精确解码。
indent参数控制是否缩进以及如何缩进;它的内容将用于输出中应该有缩进的地方。甚至像" "这样的空格也可以生效。\t和\n也可以用于制表符缩进,或者分别为每个缩进创建一个换行符。
示例输出:
## JSON.stringify(my_dictionary)
{"name":"my_dictionary","version":"1.0.0","entities":[{"name":"entity_0","value":"value_0"},{"name":"entity_1","value":"value_1"}]}
## JSON.stringify(my_dictionary, "\t")
{
"name": "my_dictionary",
"version": "1.0.0",
"entities": [
{
"name": "entity_0",
"value": "value_0"
},
{
"name": "entity_1",
"value": "value_1"
}
]
}
## JSON.stringify(my_dictionary, "...")
{
..."name": "my_dictionary",
..."version": "1.0.0",
..."entities": [
......{
........."name": "entity_0",
........."value": "value_0"
......},
......{
........."name": "entity_1",
........."value": "value_1"
......}
...]
}
Variant to_native(json: Variant, allow_objects: bool = false) static 🔗
将使用from_native()创建的符合JSON格式的值转换回原生引擎类型。
默认情况下,出于安全原因忽略对象,除非allow_objects是true。
您可以将JSON字符串转换回原生值,如下所示:
func decode_data(string, allow_objects = false):
return JSON.to_native(JSON.parse_string(string), allow_objects)