【Flutter】 オブジェクトを含んだFreezedクラスをJSONに変換する

image

この記事は、【 可茂IT塾 Advent Calendar 2021 】の22日目の記事です。

Flutterアプリ開発に関することをブログにしました。誰かのお役に立てれば幸いです。

オブジェクトがうまくJSONに変換されない

オブジェクトを含むFreezedクラスのインスタンスをJSON化して、FireStoreに追加しようとしたときにエラーが起きました。 原因は、オブジェクトの部分が、うまくJSONに変換されていなかったことでした。

似たようなFreezedクラスのコード例です。

import 'package:freezed_annotation/freezed_annotation.dart';

part 'match.freezed.dart';
part 'match.g.dart';

// オブジェクトを含んだFreezedクラス

class Match with _$Match {
  const factory Match({
    required String id,
    required Team homeTeam, //オブジェクト
    required Team awayTeam, //オブジェクト
    ('') String tournament,
  }) = _Match;

  factory Match.fromJson(Map<String, dynamic> json) => _$MatchFromJson(json);
}

このようなクラスのインスタンスをJSONにして、printすると、

print(match.toJson());

// printされた内容
{
id: XXXXXXXXXXXXXXX, 
awayTeam: Team(id: kashiwa, name:),  // ここのオブジェクトがJSONになっていない
homeTeam: Team(id: nagoya, name: 名古屋), // ここのオブジェクトがJSONになっていない
tournament: J1
}

上記のようになり、オブジェクトの部分が、JSONにうまく変換されていませんでした。

解決策

 (explicitToJson: true)

上の一行を追加するだけで、解決します。

import 'package:freezed_annotation/freezed_annotation.dart';

part 'match.freezed.dart';
part 'match.g.dart';


class Match with _$Match {
  (explicitToJson: true) // ここに一行追加
  const factory Match({
    required String id,
    required Team homeTeam, //オブジェクト
    required Team awayTeam, //オブジェクト
    ('') String tournament,
  }) = _Match;

  factory Match.fromJson(Map<String, dynamic> json) => _$MatchFromJson(json);
}
{
id: XXXXXXXXXXXXXXX, 
awayTeam: {id: kashiwa, name:},  
homeTeam: {id: nagoya, name: 名古屋}, 
tournament: J1
}

オブジェクトの部分もうまくJSONになりました。



<参考にしたサイト>

https://github.com/rrousselGit/freezed/issues/86