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-дані для визначення правильної nullability кожного поля, створюючи моделі, які коректно працюють із системою 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, а порожні масиви генерують правильно типізовані значення за замовчуванням порожніх списків.

Пов'язані інструменти