Чтение из строки в Dart
Текст JSON хранит только данные, без методов класса.
Функция jsonDecode принимает строку и
возвращает значение без проверки типа. Его
сначала сверяют с is Map<String, Object?>,
затем передают в fromJson, где ключи
и типы полей проверяют явными приведениями.
В памяти может лежать готовая строка с описанием склада. Ее можно разобрать без предварительной записи того же объекта:
import 'dart:convert';
class StorageUnit {
StorageUnit(this.code, this.capacity);
final String code;
final int capacity;
factory StorageUnit.fromJson(Map<String, Object?> json) {
return StorageUnit(
json['code'] as String,
json['capacity'] as int,
);
}
}
var text = '{"code":"W-3","capacity":40}';
var raw = jsonDecode(text);
if (raw is Map<String, Object?>) {
var unit = StorageUnit.fromJson(raw);
print(unit.code);
print(unit.capacity);
}
После разбора поля доступны как у обычного экземпляра:
code и capacity совпадают с тем, что
было в JSON. Неверное приведение типа останавливает
программу с сообщением об ошибке.
Круг «запись - чтение» часто проверяют на одном объекте: сначала получают строку, затем восстанавливают значение и сравнивают поля:
import 'dart:convert';
class StorageUnit {
StorageUnit(this.code, this.capacity);
final String code;
final int capacity;
Map<String, Object?> toJson() => {
'code': code,
'capacity': capacity,
};
factory StorageUnit.fromJson(Map<String, Object?> json) {
return StorageUnit(
json['code'] as String,
json['capacity'] as int,
);
}
}
var original = StorageUnit('W-9', 12);
var raw = jsonDecode(jsonEncode(original.toJson()));
if (raw is Map<String, Object?>) {
var restored = StorageUnit.fromJson(raw);
print(original.code == restored.code &&
original.capacity == restored.capacity);
}
Для корректного JSON вывод будет true:
восстановленный StorageUnit совпадает
с исходным по полям. Если в тексте неверный
тип числа, сработает ошибка приведения.
Объявите класс Badge с полями
label и level и фабрикой
fromJson. Из строки
{"label":"pro","level":2}
получите объект и выведите оба поля на отдельных
строках.
Создайте Badge с меткой "trial"
и уровнем 0, запишите его в текст через
toJson и jsonEncode, затем
разберите текст обратно. Выведите true,
если исходный и восстановленный объект совпадают
по обоим полям.