В этой статье
Зачем Dart/Flutter-разработчикам генерация JSON-классов
Flutter-приложения активно используют JSON для API-коммуникации, но Dart не имеет встроенного отображения JSON-в-объект, как Gson или Jackson в других языках. Каждый ответ API требует модельного класса с ручными фабричными методами fromJson и toJson. Для приложений, работающих с несколькими эндпоинтами, этот шаблонный код быстро множится — наш конвертер мгновенно генерирует полные модельные классы Dart из образцов JSON, экономя часы повторяющегося кодирования.
С момента внедрения sound null safety в Dart 2.12 каждое поле в ваших модельных классах должно быть явно типизировано как nullable или non-nullable. Конвертер анализирует ваши JSON-данные для определения правильной nullable-характеристики каждого поля, создавая модели, которые корректно работают с системой null safety Dart с самого начала.
Паттерн fromJson/toJson
Конвертер генерирует классы Dart, следуя стандартному паттерну фабричного конструктора, используемому в экосистеме Flutter.
- factory fromJson — генерирует фабричный конструктор, принимающий Map<String, dynamic> и инициализирующий все поля с правильным приведением типов, проверками null и разбором вложенных объектов
- Метод toJson — создаёт метод toJson(), возвращающий Map<String, dynamic> для сериализации, обрабатывая вложенные объекты рекурсивным вызовом их методов toJson()
- Генерация вложенных моделей — когда JSON содержит вложенные объекты, конвертер создаёт отдельные классы Dart для каждой вложенной структуры с собственными методами fromJson/toJson, правильно связанными из родительского класса
Попробуйте бесплатно — без регистрации
Конвертировать JSON в Dart →Null safety и интеграция с json_serializable
Конвертер генерирует null-safe код Dart, совместимый с современными практиками разработки Flutter.
- Sound null safety — поля с null значениями в образце JSON типизируются как nullable (String?), тогда как присутствующие значения используют non-nullable типы (String), с соответствующими проверками null в конструкторах fromJson
- Совместимость с json_serializable — сгенерированная структура классов совместима с пакетом json_serializable, позволяя добавить аннотации @JsonSerializable() и @JsonKey для генерации кода с помощью build_runner
- Обработка списков — массивы объектов генерируют типы List<ChildModel> с правильным отображением в fromJson с использованием .map() и .toList(), обрабатывая как nullable, так и non-nullable сценарии списков
Часто задаваемые вопросы
Стоит ли использовать пакет freezed вместо этого?
Пакет freezed добавляет неизменяемость, union-типы и поддержку pattern matching к классам Dart, но требует настройки build_runner и добавляет сложность при компиляции. Наш конвертер генерирует обычные классы Dart, которые работают без зависимостей генерации кода. Вы можете мигрировать вывод на freezed позже, добавив аннотации — имена полей и типы остаются такими же.
Как конвертер обрабатывает вложенные JSON-модели?
Каждый вложенный JSON-объект становится отдельным классом Dart с собственным фабричным методом fromJson и методом toJson. Родительский класс ссылается на дочерний класс в своём объявлении типа и вызывает ChildModel.fromJson() в своём фабричном конструкторе. Глубоко вложенные структуры полностью поддерживаются с правильными иерархиями типов.
Как обрабатываются поля List в сгенерированном коде?
Списки примитивов генерируют простые типизированные списки (List<String>, List<int>). Списки объектов генерируют List<ChildModel> с отображением fromJson: (json['items'] as List).map((e) => ChildModel.fromJson(e)).toList(). Nullable списки включают проверки null, а пустые массивы генерируют правильно типизированные значения по умолчанию пустых списков.