JSON

Наследует: Resource < RefCounted < Object

Вспомогательный класс для создания и анализа данных JSON.

Описание

Класс JSON позволяет преобразовывать все типы данных в строку JSON и из нее. Это полезно для сериализации данных, например, для сохранения в файл или отправки по сети.

stringify() используется для преобразования любого типа данных в строку JSON.

parse() используется для преобразования любых существующих данных JSON в Variant, который может использоваться в Godot. В случае успешного анализа используйте 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:

  • Завершающие запятые в массивах или объектах игнорируются, а не вызывают ошибку синтаксического анализатора.

  • Символы новой строки и табуляции принимаются в строковых литералах и обрабатываются как соответствующие им escape-последовательности \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 🔗

Содержит проанализированные данные JSON в форме Variant.


Описания метода

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))

int get_error_line() const 🔗

Возвращает 0, если последний вызов parse() был успешным, или номер строки, в которой анализ не удался.


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 🔗

Преобразует переменную типа Variant в текст JSON и возвращает результат. Полезно для сериализации данных для хранения или передачи по сети.

Примечание: Спецификация JSON не определяет целочисленные или числа с плавающей запятой, а только тип число. Поэтому преобразование переменной типа Variant в текст JSON преобразует все числовые значения в тип float.

Примечание: Если full_precision имеет значение true, то при преобразовании чисел с плавающей запятой в строку, ненадежные цифры преобразуются в строку в дополнение к надежным цифрам для обеспечения точного декодирования.

Параметр indent управляет тем, как и когда выполняется отступ; его содержимое будет использоваться там, где в выводе должен быть отступ. Даже пробелы, такие как " ", будут работать. \t и \n также можно использовать для отступа с помощью табуляции или для создания новой строки для каждого отступа соответственно.

Предупреждение: Неконечные числа не поддерживаются в JSON. Любые вхождения @GDScript.INF будут заменены на 1e99999, а отрицательные @GDScript.INF будут заменены на -1e99999, но большинство парсеров JSON правильно интерпретируют их как бесконечность. @GDScript.NAN будет заменен на null и не будет интерпретироваться как NaN в парсерах JSON. Если вы ожидаете неконечные числа, рассмотрите возможность предварительной передачи ваших данных через from_native().

Пример вывода:

## 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 🔗

Преобразует JSON-совместимое значение, созданное с помощью from_native(), обратно в собственные типы движка.

По умолчанию объекты игнорируются из соображений безопасности, если только allow_objects не равен true.

Вы можете преобразовать строку JSON обратно в собственное значение следующим образом:

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