JSONからDartへの変換ツール

ステップ 1 / 333%

JSONオブジェクト、または複数のオブジェクトサンプルを含む配列から、外部パッケージに依存しないDartモデルクラスを生成します。すべてのサンプル項目を統合し、ネストしたクラスを作成して、元のJSONキーを保持したまま、適切なNull Safety対応フィールド型とfromJsonファクトリコンストラクタを出力します。jsonEncodeに対応する出力が必要な場合はtoJsonメソッドも追加できます。サンプルと生成コードはこのブラウザ内だけに保存され、アップロードやURLへの追加は行われません。

使い方

  1. 1

    実データに近いサンプルを貼り付ける

    1つのJSONオブジェクト、またはオブジェクトの配列を使用します。複数項目を含めると、欠落フィールド、nullableフィールド、型が混在するフィールドを見つけやすくなります。

  2. 2

    Dartの設定を選ぶ

    ルートクラス名を指定し、すべてのフィールドをnullableにするか、toJsonメソッドを含めるかを選びます。

  3. 3

    確認して書き出す

    推論されたクラスを確認し、コードをコピーするか、models.dartファイルを端末にダウンロードします。

JSONをNull Safety対応Dartモデルに変換する仕組み

Dart公式のdart:convertドキュメントでは、jsonDecode()が数値、文字列、Boolean、null、リスト、文字列キーのマップなど、JSONに対応する値を返すと説明されています。モデルクラスをそのままJSONにエンコードすることはできませんが、jsonEncode()はクラスのtoJson()メソッドを呼び出せます。このツールはjson_serializableのアノテーションや外部パッケージを追加せずに、この手動シリアライズ方式のコードを生成します。

たとえば、サンプルにネストした住所を持つユーザーが含まれているとします。生成されるUserにはfinalフィールドと名前付き引数のコンストラクタが含まれます。User.fromJson(Map<String, Object?> json)はスカラー値をキャストし、ネストしたオブジェクトにはUserAddress.fromJson()を呼び出します。いずれかのサンプルオブジェクトでaddressが欠落しているかnullの場合、型はUserAddress?となり、ファクトリは生成前にnullを確認します。toJsonを有効にすると、ネストしたモデルも再帰的にjsonEncode()が受け取れるマップへ変換されます。

JSONで確認された値 生成されるDart型
整数 int
小数 double
整数と小数の両方 num
文字列 String
真偽値 bool
ネストしたオブジェクト 生成されたモデルクラス
型が揃った配列 List<T>
空、または互換性のないネスト配列 List<Object?>
nullだけ、または競合する値 Object?

このツールはルート配列の先頭項目だけでなく、すべてのオブジェクトを調べます。いずれかの項目にフィールドがない場合、または明示的にnullが入っている場合、そのフィールドはnullableになります。実際のAPIがサンプルより不規則な場合は、すべてのフィールドをnullableにすることもできます。DartのNull Safetyガイドにあるとおり、型は初期状態ではnullを許容せず、nullを受け入れるには?が必要です。

識別子の処理と型推論の限界

JSONキーは有効なDartメンバー名である必要がありません。句読点を取り除き、単語をlowerCamelCaseへ変換し、予約語には安全な接尾辞を付けます。名前が重複した場合は、結果が毎回変わらないよう数値の接尾辞を追加します。元のキーはjson['original-key']toJson()のマップ内にそのまま残ります。ネストしたクラス名には完全なパスを使うため、無関係な住所オブジェクトが意図せず同じクラスにまとめられることはありません。

1つのサンプルだけではAPIの仕様全体を証明できません。JSON文字列が日付、UUID、enumとして自動認識されることはなく、空の配列から要素型を判断することもできません。同じオブジェクトメンバー名が重複している場合も、JSONパーサーは通常最後の値だけを保持するため、往復変換の安全性は保証されません。本番環境で使う前に、生成モデルをAPIドキュメントやスキーマと照合してください。ブラウザでの処理量を抑えるため、入力サイズ、ネストの深さ、推論する宣言数、出力サイズには上限があります。

よくある質問

いいえ。解析、型推論、コード生成、コピー、ダウンロードはブラウザ内で行われます。JSONと生成されたDartコードが当社のサーバーへ送信されたり、URLに入ったりすることはありません。

はい。FlutterはDartを使用するため、外部パッケージに依存しないこれらのクラスをFlutterプロジェクトで利用できます。まず、推論された型を実際のAPI仕様と照合してください。

いいえ。パッケージやbuild_runnerに依存せず、手動のfromJsonと任意のtoJsonメソッドを生成します。

null、または欠落していることが確認されたフィールドはnullableになります。サンプルが実データを十分に表していない場合は、生成するすべてのフィールドをnullableにできます。

いいえ。結果に反映されるのは、確認できた値だけです。複数のオブジェクトサンプルを使い、提供元のスキーマやドキュメントと結果を比較してください。

関連ツール

このツールは他の言語でも利用できます