Инструмент Tool Kumar

JSON в Dart

Генерируйте модели Dart для ответа API во Flutter. Для каждого вложенного класса создаются final-поля, const-конструктор, фабрика fromJson и метод toJson.

Как пользоваться инструментом

  1. Вставьте типичный ответ, включая записи с разным набором полей.
  2. Проверьте сгенерированный код и при необходимости измените имя корня.
  3. Скопируйте или скачайте код, затем сверьте типы с контрактом вашего API.

Пример с разбором

Этот результат создан встроенным конвертером. По двум ценам товаров выводится тип поля с плавающей точкой. Значения null и строка в поле note дают тип, допускающий null.

Ввод

{
  "user-id": 42,
  "profile": {
    "city": "London",
    "created_at": "2026-10-14T09:00:00Z"
  },
  "items": [
    {
      "price": 12,
      "note": null
    },
    {
      "price": 12.5,
      "note": "gift"
    }
  ]
}

Результат

class Root {
  final int userId;
  final Profile profile;
  final List<Item> items;

  const Root({
    required this.userId,
    required this.profile,
    required this.items,
  });

  factory Root.fromJson(Map<String, dynamic> json) => Root(
    userId: json['user-id'] as int,
    profile: Profile.fromJson(json['profile'] as Map<String, dynamic>),
    items: (json['items'] as List<dynamic>).map((e) => Item.fromJson(e as Map<String, dynamic>)).toList(),
  );

  Map<String, dynamic> toJson() => {
    'user-id': userId,
    'profile': profile.toJson(),
    'items': items.map((e) => e.toJson()).toList(),
  };
}

class Profile {
  final String city;
  final String createdAt;

  const Profile({
    required this.city,
    required this.createdAt,
  });

  factory Profile.fromJson(Map<String, dynamic> json) => Profile(
    city: json['city'] as String,
    createdAt: json['created_at'] as String,
  );

  Map<String, dynamic> toJson() => {
    'city': city,
    'created_at': createdAt,
  };
}

class Item {
  final double price;
  final String? note;

  const Item({
    required this.price,
    this.note,
  });

  factory Item.fromJson(Map<String, dynamic> json) => Item(
    price: (json['price'] as num).toDouble(),
    note: json['note'] as String?,
  );

  Map<String, dynamic> toJson() => {
    'price': price,
    'note': note,
  };
}

Использование модели во Flutter

Импортируйте dart:convert и вставьте сгенерированные классы в файл модели. Передайте декодированный ответ (Map) в Root.fromJson. jsonEncode вызывает сгенерированный метод toJson.

Если в проекте уже используется json_serializable, адаптируйте поля под этот процесс, чтобы не поддерживать два набора сгенерированных методов JSON.

import 'dart:convert';

final model = Root.fromJson(jsonDecode(responseBody) as Map<String, dynamic>);
final text = jsonEncode(model.toJson());

Параметры и особые случаи

  • Ключи JSON вроде user-id превращаются в поля в camelCase. Сгенерированные методы JSON сохраняют исходные ключи.
  • Целые и дробные цены объединяются в double. Декодер приводит значение через num и вызывает toDouble, поэтому подходят оба значения из примера.
  • Null вместе со строкой даёт String?. Поле, которое встречается только как null, остаётся dynamic, потому что его предполагаемый тип неизвестен.
  • Даты остаются String. Разбор DateTime настройте сами. Dart, скомпилированный для веба, не может точно представить все большие целые числа.

Конфиденциальность по умолчанию

Документ остаётся в этом браузере. Tool Kumar разбирает и конвертирует данные, создаёт файлы для скачивания на вашем устройстве, без регистрации и отправки на сервер.

Вопросы об инструменте «JSON в Dart»

Генерирует ли он аннотации json_serializable?
Нет. Методы fromJson и toJson пишутся напрямую. Нет ни аннотаций @JsonSerializable, ни part-файлов, ни шага build_runner.
Как учитывается null safety?
Значения null и поля, отсутствующие в части записей, делают выведенные поля nullable. Поля без null становятся обязательными (required) аргументами конструктора. Поля, содержащие только null, получают тип dynamic.
Можно ли конвертировать массивы вложенных объектов?
Да. Из примера получается List<Item>: каждый входной элемент проходит через Item.fromJson, а при кодировании для каждого элемента вызывается toJson.
Нужен ли пакет Flutter?
Сгенерированные модели используют базовые типы Dart. Декодируйте текст ответа с помощью dart:convert, затем вызовите Root.fromJson.

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

JSON в Swift: модели Codable, JSON в Kotlin: data-классы и Генератор JSON Schema.