【Dart】json_serializableについて

Flutter

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フィールドをカスタムロジックでシリアライズおよびデシリアライズしています。

Buy me a coffee!

Flutterアプリ開発
シェアする
sogaをフォローする
タイトルとURLをコピーしました