🕌

json_serializableで自動生成されたファイルの内容の理解

に公開

はじめに

json_serializableパッケージによって自動生成された、JSON と Dart オブジェクト間の変換を行うコードです。今回はこの自動生成コードが何をしているのかをメモとして記しておきます。

主な機能

このコードは大きく分けて 2 つの機能を提供しています:

  1. _$PersonFromJson: JSON データから Person オブジェクトへの変換(デシリアライズ
  2. _$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,
    };

1. _$PersonFromJson関数

この関数は JSON データ(Dart 内ではMap<String, dynamic>として表現)を受け取り、_Personクラスのインスタンスを返します。

  • json['firstName']: JSON の"firstName"フィールドから値を取得してString型に変換
  • json['lastName']: JSON の"lastName"フィールドから値を取得してString型に変換
  • json['age']: JSON の"age"フィールドから値を取得してnum型に変換し、さらにtoInt()で int 型に変換

2. _$PersonToJson関数

この関数は_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