目次
概要
アプリを開発する時、特にAPI通信を行う時などにJSONデータをやり取りすることはよくある。
そこで、一旦データが正常かどうかとか、仮のデータでテストしたい場合はローカルでJSONフファイルを用意して動作確認をしたい時の方法を記す。
ソースコード
assets:
- json/
libディレクトリと同じ階層に「json」という名前のディレクトリを作成し、
その中にJSONファイルを生成する。
例として、以下のようなJSONファイルを格納した。
{
"id": 0,
"place_name": "アッピア本店",
"address": "東京都港区南麻布4-11-35 インペリアル広尾 B101",
"url": "https://tabelog.com/tokyo/A1307/A130703/13001593/",
"register_at": "2025-05-25 00:00:00",
"update_at": "2025-05-25 00:00:00"
}
以下はJSONファイルを格納したいレスポンス用のクラスと、
JSONデータからレスポンス用クラスに格納するための処理になる。
class PlaceEntity {
final int id;
final String placeName;
final String address;
final String url;
final DateTime registerAt;
final DateTime updateAt;
PlaceEntity(
{required this.id,
required this.placeName,
required this.address,
required this.url,
required this.registerAt,
required this.updateAt});
factory PlaceEntity.fromData(dynamic data) {
final int id = data['id'];
final String placeName = data['place_name'];
final String address = data['address'];
final String url = data['url'];
final DateTime registerAt = DateTime.parse(data['register_at']);
final DateTime updateAt = DateTime.parse(data['update_at']);
final model = PlaceEntity(
id: id,
placeName: placeName,
address: address,
url: url,
registerAt: registerAt,
updateAt: updateAt);
return model;
}
}
// こちらはclassの外部に記載するimport部分
import 'package:flutter/services.dart' show rootBundle;
import 'dart:convert';
// こちらはメンバ変数になる。
String _dummy = "";
// こちらはメソッド内の処理になる。
try {
String dummy = await rootBundle.loadString("json/dummy.json");
final response = json.decode(dummy);
response
.forEach((key, value) => _dummy = _dummy + '$key: $value \x0A');
final model = response.fromData(data);
return models;
} on Exception catch (exception) {
throw Exception(exception);
}
デモ動画
詳細
手順としては以下の通りになる。
pubspec.yamlのassetに追加する。
JSONファイルを使う場合、assetのところに追加する。
まずはこれでJSONファイルはここにあるという宣言をしておく。
JSONファイルを格納する
JSONファイルを格納する場所はjsonという名前のディレクトリの直下に置かないとエラーになることに注意。
そして、「json」ディレクトリはlibディレクトリと同じ階層に作成する必要がある。
assetでの設定次第では別の場所にも書けると思うが、今回はそこまでする必要がないため、この程度にしておく。
取得したJSONデータを自分で作成したクラスの変数に格納する
まずはJSONデータを取得する。それは以下の部分だ。
ただ、servicesを追加しておく必要がある。
String dummy = await rootBundle.loadString("json/dummy_place.json");
レスポンス用のクラスにfromsJSONという名前のメソッドでJSONデータを変数に格納する処理をあらかじめ作成しておく。そこがJSONデータの変換部分だ。
factory PlaceEntity.fromData(dynamic data) {
final int id = data['id'];
final String placeName = data['place_name'];
final String address = data['address'];
final String url = data['url'];
final DateTime registerAt = DateTime.parse(data['register_at']);
final DateTime updateAt = DateTime.parse(data['update_at']);
final model = FavoritePlaceEntity(
id: id,
placeName: placeName,
address: address,
url: url,
registerAt: registerAt,
updateAt: updateAt);
return model;
}
そして、取得したJSONデータは以下の処理で変換する。
final response = json.decode(dummy);
response
.forEach((key, value) => _dummy = _dummy + '$key: $value \x0A');
final model = response.fromData(data);