Перейти к содержанию

JSON в Dart-класс

Преобразуйте пример JSON в Dart-класс с методами fromJson, toJson и вложенными моделями.

Входные данные
Выходные данные

JSON в Dart-класс

Вставьте пример JSON и этот инструмент определяет форму данных и генерирует соответствующий Dart-класс — такой, который вы обычно писали бы вручную для модели Flutter. Вложенные объекты становятся отдельными классами, массивы становятся типизированными полями `List<...>`, и каждый класс поставляется с именованным конструктором, фабричным методом `fromJson` и методом `toJson`, поэтому результат можно сразу использовать в проекте Flutter или Dart.

Опции управляют стилем генерируемого кода. «Имя класса» устанавливает корневой класс; вложенные классы названы в честь ключа JSON, который их представил. «Безопасность null с обязательными полями» отмечает поля, присутствующие в каждом образце, как `required` с типом, не допускающим null, и поля, которые иногда отсутствуют или равны null, как nullable и optional — отключите, чтобы сделать каждое поле nullable, что более снисходительно к несогласованным ответам API. «Аннотации json_serializable» переключаются с написанных вручную тел `fromJson`/`toJson` на аннотации `@JsonSerializable()` и `@JsonKey`, которые делегируют файлу сгенерированной части `.g.dart`, для проектов, уже использующих этот пакет и build_runner. «Неизменяемые поля» делает класс неизменяемым; «Генерировать copyWith» добавляет метод создания модифицированной копии без изменения оригинала, и «Генерировать == и hashCode» добавляет сравнение значений, чтобы два экземпляра с одинаковыми значениями полей сравнивались как равные. «Отступ» переключает генерируемый код между 2 и 4 пробелами.

Когда одна и та же форма объекта повторяется — например, массив элементов с одинаковыми полями — инструмент повторно использует один класс вместо генерирования дубликата для каждого вхождения, и поле, отсутствующее только в некоторых записях массива, правильно выводится как optional, а не required. Ключи JSON, которые не являются допустимыми идентификаторами Dart, используют различные регистры или конфликтуют с ключевым словом или сгенерированным методом (например, `copyWith` или `hashCode`), автоматически переименовываются на стороне Dart, а исходный ключ сохраняется для кодирования и декодирования.

Всё работает локально в вашем браузере: образец JSON никогда не загружается никуда, что важно, если он содержит реальные данные пользователя или форму ответа внутреннего API. Скопируйте класс, загрузите его как файл .txt или отправьте результат обратно на вход, чтобы преобразовать одну вложенную часть дальше.

FAQ

Как обрабатываются вложенные объекты и массивы?
Каждый вложенный объект становится своим Dart-классом, названным в честь поля, которое его представило, а массив объектов становится типизированным List<YourClass>. Если одна и та же форма появляется несколько раз, инструмент переиспользует один класс вместо дублирования.
Что именно меняет "Безопасность null с обязательными полями"?
Когда этот параметр включен, поле, которое инструмент видит в каждом образце, получает тип, не допускающий null, и параметр конструктора `required`; поле, которое иногда отсутствует или равно null, получает nullable тип без ключевого слова `required`. Отключение делает каждое поле nullable и optional, что более терпимо к API, чьи ответы варьируются.
Нужен ли мне пакет json_serializable?
Только если вы включите опцию «Аннотации json_serializable», которая выпускает @JsonSerializable()/@JsonKey и директиву part, ожидающую сгенерированный файл .g.dart от build_runner. Оставьте его отключенным, и инструмент напишет обычные методы fromJson/toJson без зависимостей.
Может ли он правильно определить тип числового поля?
Да. Поле, которое всегда является целым числом, становится int; если какое-либо значение образца имеет десятичную точку, все поле расширяется до double, чтобы ни одно значение не было усечено.
Загружается ли мой JSON куда-нибудь?
Нет. Класс генерируется полностью в вашем браузере — ваш образец JSON никогда не покидает ваше устройство.