100% ローカル — データがブラウザの外に出ることはありません

JSONをDartに変換|fromJsonとtoJsonまで書き出す

JSONのサンプルをDartのクラスに変換します。元のキーは生成された fromJson と toJson の中にあるので、対応づけは読める・追えるコードとして手元に残ります。

高速 プライベート Cookieゼロ

JSON 入力

Dart 出力

このツールの動作

JSON の標本が Dart のクラスになります。それぞれに fromJson の工場と toJson のメソッドが付きます。

{ "id": 1, "firstName": "Ada", "address": { "city": "Paris" } }
class Root {
  final int id;
  final String firstName;
  final Address address;

  Root({required this.id, required this.firstName, required this.address});

  factory Root.fromJson(Map<String, dynamic> json) => Root(
        id: json['id'] as int,
        firstName: json['firstName'] as String,
        address: Address.fromJson(json['address'] as Map<String, dynamic>),
      );

  Map<String, dynamic> toJson() => <String, dynamic>{
        'id': id,
        'firstName': firstName,
        'address': address.toJson(),
      };
}

build_runner も注釈も、生成される part ファイルも要りません。対応づけはそこにあり、あなたが書き換えられます。

鍵は決して消えない

Dart の項目名にハイフンは使えず、数字でも始められず、class は予約語です。名前を変えざるをえないとき、行きも帰りも鍵を保ちます。

  final String contentType;
  final int class_;

  factory Root.fromJson(Map<String, dynamic> json) => Root(
        contentType: json['content-type'] as String,
        class_: json['class'] as int,
      );

  Map<String, dynamic> toJson() => <String, dynamic>{
        'content-type': contentType,
        'class': class_,
      };

対応づけが約束事ではなくコードなので、実行時に推し量られるものはありません。送る前に、送られるものを読めます。

並びと入れ子のオブジェクト

オブジェクトの並びは独立したクラスになり、対応づけがそれを辿ります。

        items: (json['items'] as List<dynamic>)
            .map((e) => ItemsItem.fromJson(e as Map<String, dynamic>))
            .toList(),

スカラーの並びは、より軽い cast を使います。(json['tags'] as List<dynamic>).cast<String>() です。

標本が言えないこと

どの項目も final かつ required で、null を許すものはありません。文書がそれぞれに値を持っていたからです。おかげで、鍵が欠けていれば復号の時点で項目名付きの TypeError になります。三画面先まで運ばれてから壊れる null にはなりません。

dynamic になるのは null だけです。何でも受け取り、何も確かめません。空の並びや型の混ざった並びが List<dynamic> になるのも同じ理由です。二つ目の荷が手に入ったら、まず見直す値打ちのある三箇所です。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

json_serializable や build_runner は要りますか。
要りません。`fromJson` の工場と `toJson` のメソッドは丸ごと書き出されるので、クラスは `jsonDecode` だけで動きます。すでに json_serializable をお使いなら、その生成コードが注釈で同じ仕事をします。この出力は、ビルドを走らせずに読める版です。
実行時に鍵が無いとどうなりますか。
キャストが例外を投げます。`json['id'] as int` は、鍵が無ければ `null` を `int` にキャストすることであり、項目名を含む `TypeError` になります。声の大きな失敗であり、正しい失敗です。鍵が常にあった標本は、それが省略可能だとは言えません。分かった時点で `int?` にし、`required` を外してください。
JSON のメソッドを出さないようにできますか。
できます。設定を切り替えると、項目と構築子だけのクラスになります。直列化を別の場所で生成しているコードに貼るときや、JSON に出会うことのない単なる値の入れ物のときに向いています。

関連ツール