Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗dtSpJsDc 112 of 224 menu
◀ ▶

Чтение из строки в 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, если исходный и восстановленный объект совпадают по обоим полям.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить