Как десериализовать JSON в Dart/Flutter?

«Как десериализовать JSON в Dart/Flutter?» — вопрос из категории Сети, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Dart/Flutter есть два основных подхода: ручной парсинг с dart:convert и автоматический с помощью пакета json_serializable.

1. Ручной способ (dart:convert):

import 'dart:convert';

class User {
  final String name;
  final int age;

  User({required this.name, required this.age});

  factory User.fromJson(Map<String, dynamic> json) {
    return User(
      name: json['name'] as String,
      age: json['age'] as int,
    );
  }
}

void main() {
  String jsonString = '{"name": "John", "age": 30}';
  Map<String, dynamic> jsonMap = jsonDecode(jsonString);
  User user = User.fromJson(jsonMap);
  print(user.name); // John
}

2. Автоматический способ (json_serializable): Этот способ предпочтительнее для сложных моделей, так как генерирует код парсинга, избегая опечаток.

  • Добавьте зависимости в pubspec.yaml:
    
    dependencies:
    json_annotation: ^4.8.1

dev_dependencies: build_runner: ^2.4.4 json_serializable: ^6.7.1

*   Создайте модель с аннотацией:
```dart
import 'package:json_annotation/json_annotation.dart';

part 'user.g.dart';

@JsonSerializable()
class User {
  final String name;
  final int age;

  User({required this.name, required this.age});

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}
  • Сгенерируйте код парсера командой:
    flutter pub run build_runner build

Почему json_serializable лучше? Он обеспечивает типобезопасность, автоматически генерирует методы toJson/fromJson и легко масштабируется при изменении структуры модели.