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序列,不会导致解析器错误。相反,字符串会被清理并将错误记录到控制台。

属性

Variant

data

null

方法

Variant

from_native(variant: Variant, full_objects: bool = false) static

int

get_error_line() const

String

get_error_message() const

String

get_parsed_text() const

Error

parse(json_text: String, keep_text: bool = false)

Variant

parse_string(json_string: String) static

String

stringify(data: Variant, indent: String = "", sort_keys: bool = true, full_precision: bool = false) static

Variant

to_native(json: Variant, allow_objects: bool = false) static


属性说明

Variant data = null 🔗

包含Variant形式的已解析JSON数据。


方法说明

Variant from_native(variant: Variant, full_objects: bool = false) static 🔗

将原生引擎类型转换为符合JSON的值。

默认情况下,出于安全考虑,忽略对象,除非full_objectstrue

您可以将原生值转换为JSON字符串,例如:

func encode_data(value, full_objects = false):
    return JSON.stringify(JSON.from_native(value, full_objects))

int get_error_line() const 🔗

如果最后一次调用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_precisiontrue,当字符串化浮点数时,除了可靠数字之外,还会字符串化不可靠的数字,以保证精确解码。

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_objectstrue

您可以将JSON字符串转换回原生值,如下所示:

func decode_data(string, allow_objects = false):
    return JSON.to_native(JSON.parse_string(string), allow_objects)