РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
538 of 723 menu

Параметр toEncodable у jsonEncode

Параметр toEncodable у функции jsonEncode позволяет указать пользовательскую функцию для преобразования объектов, которые стандартный JSON-энкодер не умеет сериализовать. По умолчанию jsonEncode выбрасывает исключение JsonUnsupportedObjectError, если встречает объект неподдерживаемого типа. Функция, переданная в toEncodable, принимает один параметр - исходный объект - и должна вернуть значение, которое JSON-энкодер сможет обработать: число, строку, логическое значение, null, список или карту.

Параметр является необязательным. Если его не указать, поведение остается стандартным: любые объекты, не входящие в набор поддерживаемых типов, приводят к ошибке сериализации.

Синтаксис

jsonEncode(object, {Object? toEncodable(Object? object)?})

Пример

Давайте попробуем сериализовать объект пользовательского класса без toEncodable и посмотрим, что произойдет:

import 'dart:convert'; class Point { int x; int y; Point(this.x, this.y); } void main() { Point point = Point(1, 2); try { print(jsonEncode(point)); } catch (e) { print(e.runtimeType); } }

Результат выполнения кода:

JsonUnsupportedObjectError

Пример

Теперь передадим в toEncodable функцию, которая превращает объект класса Point в карту:

import 'dart:convert'; class Point { int x; int y; Point(this.x, this.y); } void main() { Point point = Point(1, 2); String res = jsonEncode( point, toEncodable: (object) { if (object is Point) { return {'x': object.x, 'y': object.y}; } return object.toString(); } ); print(res); }

Результат выполнения кода:

"{"x":1,"y":2}"

Пример

Давайте сериализуем список, содержащий объекты разных неподдерживаемых типов, и обработаем каждый из них в toEncodable:

import 'dart:convert'; class Point { int x; int y; Point(this.x, this.y); } class User { String name; User(this.name); } void main() { List<Object> data = [ Point(1, 2), User('abcde'), 42 ]; String res = jsonEncode( data, toEncodable: (object) { if (object is Point) { return {'x': object.x, 'y': object.y}; } if (object is User) { return {'name': object.name}; } return object.toString(); } ); print(res); }

Результат выполнения кода:

"[{"x":1,"y":2},{"name":"abcde"},42]"

Смотрите также

  • функция jsonEncode,
    которая кодирует объект в JSON-строку
  • функция jsonDecode,
    которая декодирует JSON-строку в объект
  • класс JsonEncoder,
    который выполняет JSON-кодирование
  • ошибка JsonUnsupportedObjectError,
    которая возникает при неподдерживаемом объекте
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить