json_serializableとは
json_serializable
は、Dart Build System用のビルダーを提供し、クラスに注釈を付けることでJSONの処理を自動化するパッケージです。これにより、DartクラスのtoJsonおよびfromJsonメソッドを自動生成できます。

json_serializable | Dart package
Automatically generate code for converting to and from JSON by annotating Dart classes.
インストール
pubspec.yaml
ファイルに依存関係を追加します。
dependencies:
json_annotation: ^6.8.0
dev_dependencies:
build_runner: ^2.3.3
json_serializable: ^6.8.0
基本的な使用方法
クラスの定義と注釈の追加
まず、Dartクラスを定義し、それにJsonSerializable
注釈を付けます。
import 'package:json_annotation/json_annotation.dart';
part 'example.g.dart';
@JsonSerializable()
class Person {
final String firstName;
final String lastName;
final DateTime? dateOfBirth;
Person({required this.firstName, required this.lastName, this.dateOfBirth});
factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
Map<String, dynamic> toJson() => _$PersonToJson(this);
}
コードの生成
注釈を追加したら、次にコードを生成します。
dart run build_runner build
これにより、example.g.dart
というファイルが生成され、以下のようなコードが含まれます。
part of 'example.dart';
Person _$PersonFromJson(Map<String, dynamic> json) {
return Person(
firstName: json['firstName'] as String,
lastName: json['lastName'] as String,
dateOfBirth: json['dateOfBirth'] == null
? null
: DateTime.parse(json['dateOfBirth'] as String),
);
}
Map<String, dynamic> _$PersonToJson(Person instance) => <String, dynamic>{
'firstName': instance.firstName,
'lastName': instance.lastName,
'dateOfBirth': instance.dateOfBirth?.toIso8601String(),
};
生成されたコードの使用
生成されたコードを使用して、オブジェクトをJSONに変換したり、JSONからオブジェクトを作成したりできます。
void main() {
// JSONからオブジェクトを作成
final person = Person.fromJson({
'firstName': 'John',
'lastName': 'Doe',
'dateOfBirth': '2000-01-01T00:00:00.000'
});
// オブジェクトをJSONに変換
final json = person.toJson();
print(json);
}
カスタムフィールドの変換
特定のフィールドにカスタム変換を追加するには、JsonKey
注釈を使用します。
@JsonSerializable()
class Sample {
@JsonKey(fromJson: _fromJson, toJson: _toJson)
final DateTime date;
Sample(this.date);
factory Sample.fromJson(Map<String, dynamic> json) => _$SampleFromJson(json);
Map<String, dynamic> toJson() => _$SampleToJson(this);
static DateTime _fromJson(int millisecondsSinceEpoch) =>
DateTime.fromMillisecondsSinceEpoch(millisecondsSinceEpoch);
static int _toJson(DateTime date) => date.millisecondsSinceEpoch;
}
この例では、date
フィールドをカスタムロジックでシリアライズおよびデシリアライズしています。