はじめに
json_serializableパッケージを使うとjsonをモデルバインドできますが、パッケージのリファレンスにはJSONの読み書き例が書いていないので私が試した方法を記しておきます。
パッケージの追加
https://pub.dev/packages/json_serializable
https://pub.dev/packages/json_annotation
https://pub.dev/packages/build_runner
json_serializable
を利用するにはjson_annotation
も必要になります。またdart run build_runner build
コマンドでエラーが出たら別途build_runner
もpub addします。
Settingモデルの作成
@JsonSerializable()
class Setting {
final String memo;
Setting({required this.memo});
factory Setting.fromJson(Map<String, dynamic> json) =>
_$SettingFromJson(json);
Map<String, dynamic> toJson() => _$SettingToJson(this);
}
Exampleを見ながらmodelを作成します。ここでのSettingモデルとはアプリの構成を保存するための自前で用意するモデルのことを指します。そういうmodelが動作を確認するためにメンバはmemoだけの最小構成としました。
partファイルを指定する
import 'package:json_annotation/json_annotation.dart';
part 'example.g.dart';
Exampleではexample.g.dart
となっていますが、利用するdartのファイル名を揃えます。main.dart
であればmain.g.dart
とします。
モデルバインドしながらJSONの読み書き
var jsonFile = File("D:\\flutter.json");
// モデルからJsonへの書き出し
// Model to Write Json
var model = Setting(memo: "メモ");
var enc = jsonEncode(model.toJson());
await jsonFile.writeAsString(enc);
// Jsonからモデルへの読み込み
// Model from Read Json
if (jsonFile.existsSync()) {
var contents = await jsonFile.readAsString();
var dec = jsonDecode(contents);
var model = Setting.fromJson(dec);
debugPrint('memo=${model.memo}');
}
記事によってはjson.encodeやjson.decodeとしている場合があるかと思いますが、json.dart
の実装を見ると例えばjsonEncodeメソッドは以下のようになっているためどちらの書き方でもいいのかもしれません。
String jsonEncode(Object? object,
{Object? toEncodable(Object? nonEncodable)?}) =>
json.encode(object, toEncodable: toEncodable);
🔰おわり
私はFlutter初心者🔰なので今回はじめてJsonに触れました。ちょっとクセがありますがアプリの設定ファイルはxmlではなくjsonに決めようと思います。