Параметр 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,
которая возникает при неподдерживаемом объекте