Skip to main content
CheckTown
Конвертеры

Как конвертировать JSON в модельные классы Dart

Опубликовано 5 мин чтения
В этой статье

Зачем 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, а пустые массивы генерируют правильно типизированные значения по умолчанию пустых списков.

Похожие инструменты