このツールの動作
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だけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。