🍭

【Flutter】jsonのencode時にdynamic型だとエラー

2021/05/11に公開

dynamic型について

Flutter(dart)にはdynamic型と呼ばれる、動的に型付け可能な型が用意されています。【Dart】【Flutter】dynamic型(動的型付け)の記事にある通り、文字列だろうが数値だろうが入るような型です。
dynamic型は、例えば外部API等からデータを取得する際に、特に型付けせずにデータを取得したいなどのケースで使用するかもしれません。【Flutter】JSONをデコードするの記事にあるような例ですね。json.decodeでは問題なくdynamic型が取得できるのですが、ではencodeの時どうなるのというのが今回の記事です。

dynamic型のencode

結論から言うとエラーになります。Converting object to an encodable object failedのstackoverflowの記事にある通り、dynamic型はencode不可のようです。対応方法はstackoverflowの記事でいくつか紹介されてますが、素直にclassを作成してjsonの変換関数(fromJson、toJson)を定義するのが一番手っ取り早そうです。

実装サンプル

上記のstackoverflowの記事のほぼそのままですが、実装サンプルのせておきます。型を作成した上でjson.encodeで処理すればエラーは発生しません。

sample_user.dart
class SampleUser {
  final String id;
  final String name;
  final String mailAddress;

  SampleUser({this.id, this.name, this.mailAddress});

  SampleUser.fromJson(Map<String, dynamic> json)
      : id = json["id"],
        url = json["name"],
        updatedAt = json["mailAddress"];

  Map<String, dynamic> toJson() {
    return {'id': id, 'name': name, 'mailAddress': mailAddress};
  }
}

Discussion