🕌
json_serializableで自動生成されたファイルの内容の理解
はじめに
json_serializable
パッケージによって自動生成された、JSON と Dart オブジェクト間の変換を行うコードです。今回はこの自動生成コードが何をしているのかをメモとして記しておきます。
主な機能
このコードは大きく分けて 2 つの機能を提供しています:
-
_$PersonFromJson
: JSON データから Person オブジェクトへの変換(デシリアライズ) -
_$PersonToJson
: Person オブジェクトから JSON データへの変換(シリアライズ)
コードの解説
// JSONからPersonオブジェクトへの変換
_Person _$PersonFromJson(Map<String, dynamic> json) => _Person(
firstName: json['firstName'] as String,
lastName: json['lastName'] as String,
age: (json['age'] as num).toInt(),
);
// PersonオブジェクトからJSONへの変換
Map<String, dynamic> _$PersonToJson(_Person instance) => <String, dynamic>{
'firstName': instance.firstName,
'lastName': instance.lastName,
'age': instance.age,
};
_$PersonFromJson
関数
1. この関数は JSON データ(Dart 内ではMap<String, dynamic>
として表現)を受け取り、_Person
クラスのインスタンスを返します。
-
json['firstName']
: JSON の"firstName"フィールドから値を取得してString
型に変換 -
json['lastName']
: JSON の"lastName"フィールドから値を取得してString
型に変換 -
json['age']
: JSON の"age"フィールドから値を取得してnum
型に変換し、さらにtoInt()
で int 型に変換
_$PersonToJson
関数
2. この関数は_Person
オブジェクトを受け取り、JSON データ(Map<String, dynamic>
)に変換します。
-
'firstName': instance.firstName
: Person オブジェクトの firstName 属性を JSON の firstName フィールドに設定 -
'lastName': instance.lastName
: Person オブジェクトの lastName 属性を JSON の lastName フィールドに設定 -
'age': instance.age
: Person オブジェクトの age 属性を JSON の age フィールドに設定
実際の使い方
このようなコードは、通常以下のような元の Person クラスと組み合わせて使います:
part 'person.g.dart'; // 自動生成されたコードをインポート
()
class _Person {
final String firstName;
final String lastName;
final int age;
_Person({
required this.firstName,
required this.lastName,
required this.age,
});
// JSONからオブジェクトへの変換
factory _Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
// オブジェクトからJSONへの変換
Map<String, dynamic> toJson() => _$PersonToJson(this);
}
まとめ
json_serializable
パッケージによって自動生成されたコードは、JSON データと Dart オブジェクト間の変換を簡単に行えるようにする便利な仕組みです。
Discussion