Сериализация и десериализация JSON в flutter для больших проектов
В прошлой статье я рассказывал о получении JSON по HTTP и десериализации ответа. Парсинг JSON был сделан вручную. Такой вариант подходит для маленьких проектов, разрабатываемых в одиночку, но вызовет множество проблем в более крупном проекте.
Для крупных проектов разбор JSON лучше генерировать. Используется для этого пакет json_serializable.
В файле pubspec.yaml в секцию dependencies добавляем
json_annotation: ^2.0.0
А в секцию dev_dependencies
build_runner: ^1.0.0 json_serializable: ^2.0.0
dev_dependencies — это зависимости, которые используются в процессе разработки но не используются в production коде. В нашем случае это пакеты, отвечающие за генерацию кода.
Модифицируем класс из прошлой статьи
import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; @JsonSerializable() class User { final int id; @JsonKey(name: "name") final String userName; final String email; User({this.id, this.userName, this.email}); factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); }
Рассмотрим внимательнее изменения.
part 'user.g.dart';
Эта строка нужна для того, чтобы в файле user.dart были видны приватные функции из файла user.g.dart. user.g.dart — это генерируемый файл.
@JsonSerializable()
Эта аннотация указывает, что для этого класса нужно генерировать код.
@JsonKey(name: "name") final String userName;
Эта аннотация указывает, что свойство userName нужно заполнять из поля name в JSON
Теперь осталось запустить генератор командой
flutter packages pub run build_runner build
Генератор создает файл user.g.dart с двумя функциями:
User _$UserFromJson(Map<String, dynamic> json) { return User( id: json['id'] as int, userName: json['name'] as String, email: json['email'] as String); } Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{ 'id': instance.id, 'name': instance.userName, 'email': instance.email };
Это как раз те функции, которые мы используем в классе User.