Dart から JSON へのコンバーター
Dart クラスや Flutter モデルを貼り付けると、きれいな JSON が返ってきます。
このツールでできること
Flutter アプリを作っていて、まだ toJson() を書いていないモデルクラスがあったり、テスト用にサンプルの JSON ボディがほしいだけだったりするとき、Map を手で書くのは面倒です。Dart をここに貼り付ければ、有効な JSON が返ってきます。ボイラープレートも書き直しも不要です。単一クラスでも、models.dart ファイル全体でも、名前付き引数で組み立てたインスタンスでも動きます。
このコンバーターは dart:convert が実際にシリアライズする挙動に従います。final フィールドはその値のまま出力されます。int と double は JSON の数値になります。bool はそのままブール値です。DateTime は ISO-8601 文字列になり、DateTime.toIso8601String() が生成するものと同じフォーマットです。List<T> は JSON 配列に、Map<String, dynamic> は JSON オブジェクトになります。nullable 型(String?)は値が null なら null、そうでなければその値そのものを出力します。
ファクトリコンストラクタ、名前付きコンストラクタ、fromJson/toJson ヘルパーはすべて認識されます。出力に出るのは、あくまでインスタンスの中に入っているデータです。ひとつのファイルに複数のクラスをまとめて貼り付ける場合(たとえば pub.dev のパッケージから持ってきたもの)、各クラスはトップレベルのエントリになり、ネストされたインスタンスはネストした JSON オブジェクトとして展開されます。メソッドはスキップされます。enum はデフォルトで名前にシリアライズされ、一般的な describeEnum の慣習に合わせています。
使い方
たった 3 ステップ。小さなクラスを貼っても、models.dart 一式を貼っても同じ流れです。
Dart を貼り付ける(またはサンプルを試す)
Dart コードをそのまま左側のエディタに投げ込んでください。クラス定義、ファクトリコンストラクタ、複数のクラス、名前付き引数付きのインスタンス — どれでも OK です。リアルな例を見るには サンプルを読み込む をクリックしてください。
import、アノテーション(@JsonSerializable()、@freezed)、コメントは残しておいて構いません。パーサーは必要ないものは無視します。言語自体の詳しい情報は、公式リファレンスである dart.dev/language が参考になります。
変換を実行
緑色の 変換 ボタンをクリックします。ツールが Dart を読み、各クラスとフィールドをひと通り巡回して、一度の処理で JSON を生成します。処理中は短いローディングインジケータが表示されます。
JSON をコピー
右側のパネルがインデント付きの JSON で埋まります。Flutter のテスト、Dio/http のモックレスポンス、Firestore のシード、API ドキュメントなどに貼り付けて使ってください。
実際にありがたい場面
Flutter の統合テスト
Order モデルに Customer と OrderItems がネストしている状況。クラスを貼って JSON を得て、統合テストのモックレスポンスとして使えます。
API ペイロードの叩き台作り
CreateOrderRequest クラスを、Postman、curl、バックエンドのちょい試し用に使える JSON ボディに変換します。手で打ち込む必要はもうありません。
json_serializable の叩き台作り
build_runner を走らせる前に、<code>toJson()</code> が出力するかたちを正確に確認できます。新しいモデルを設計するときに重宝します。
ドキュメントを同期させる
Dart モデルから直接 JSON サンプルを生成して README や API リファレンスに載せれば、ドキュメントが実コードに追従します。
よくある質問
複数のクラスを一度に貼り付けてもいいですか?
はい、モデルファイル丸ごと貼り付けて大丈夫です。各トップレベルクラスがそれぞれの JSON エントリになり、ネストされたインスタンスはネストしたオブジェクトとして展開されます。アンダースコア始まりのプライベートフィールドも、通常の toJson() と同様に出力されます。
DateTime、Duration、nullable はどう扱いますか?
DateTime は toIso8601String() に合わせて ISO-8601 文字列になります。Duration はマイクロ秒の数値です。nullable フィールド(String?)は値が null なら null、そうでなければその値そのものを出力します。
List、Map、Set はどうなりますか?
List<T> も Set<T> も JSON 配列になります。JSON には Set 型がないので、メンバーが並べられるかたちです。Map<String, dynamic> は JSON オブジェクトになります。ネストしたジェネリクス(List<Map<String, Order>>)も再帰的に展開されます。
freezed や json_serializable のクラスも理解しますか?
はい、@freezed と @JsonSerializable のアノテーションは認識され、裏側のフィールドが JSON に反映されます。事前に build_runner を走らせる必要はありません。コンバーターは生成コードではなく宣言を読みます。
enum はどのように出力されますか?
デフォルトでは enum 値の名前が使われます(OrderStatus.paid → "paid")。一般的な慣習に合っていて、余計なマッピングコードなしで人間が読みやすい JSON になります。
貼り付けたコードは保存されますか?
Dart は変換のためにバックエンドに送られますが、保存はしません。ペイロードのログも取っていません。機密性の高いモデルコードの場合は、貼り付ける前にスクラブやレビューをしておくのが安全です。
併せて使えそうなツール
Dart から JSON はあくまで 1 ピース。以下とよく組み合わせて使われます。