はい、今回Freezedとjson_serializableでかなり端折ってしまった部分があったので、Flutterにデフォルトで入っているdart:convertパッケージ
を利用してJSONを使ってMapを変換する仕組みをまとめてみました。
main.dart
import 'package:flutter/material.dart';
import 'dart:convert' as convert;
void main() {
final map = {"firstName": "ume", "lastName": "taro", "age": 20};
// まずはMapをJSONの文字列にしてみます(エンコード)
final json = convert.json.encode(map);
print(json); // {"firstName": "ume", "lastName": "taro", "age": 20}
// つぎにJSON文字列からMapに変換(デコード)
final mapNew = convert.json.decode(json) as Map<String, dynamic>;
print(mapNew); // {firstName: ume, lastName: taro, age: 20}
// Map型をJSON文字列に変換(エンコード) この時、keyの部分は必ずStringにしないとエラーになります。
final Map<String, dynamic> encodableMap = {
"firstName": "ume",
"lastName": "jiro",
"age": 18
};
final String encodedMap = convert.json.encode(encodableMap);
print(encodedMap); // {"firstName":"ume","lastName":"jiro","age":18}
// main()の外にPerson(カスタムクラス)を作ってエンコード
Person p = new Person("ume", "saburo", 16);
print("Person:${convert.json.encode(p)}"); // Person:{"firstName":"ume","lastName":"saburo","age":16}
// 変換不可能なオブジェクトが渡されたときの対処
Object unencodable = new Object();
try {
print(convert.json.encode(unencodable, toEncodable: (e) => e.toString()));
} on convert.JsonUnsupportedObjectError {
print("Error"); // "Instance of 'Object'"
}
runApp(const ProviderScope(
child: MyApp(),
));
}
// カスタムクラスを変換する場合、クラスにtoJsonメソッドを実装
class Person {
String firstName;
String lastName;
int age;
Person(this.firstName, this.lastName, this.age);
// toJsonメソッドを使用することでencode時にJSON文字列へ変換可能なMap型オブジェクトを返す
dynamic toJson() =>
{"firstName": firstName, "lastName": lastName, "age": age};
}
以上見やすくまとめてみました。main.dart
をデバッグしてみるとログがでてきて確認できるかと、
他にもデコード時の挙動を操作できるパラメータなどもあって、また実装で使うことがあれば記事にしたいと思います。