|

Dartの勉強10-2:クラス(JSONの取扱い)

JSONはMap型と親和性の高い形式ですが、クラスを使うと型安全で可読性も上がり、再利用できて、フィールドの変更があってもクラスの変更だけで対応できて保守性も上がるいいことずくめだということです。

import 'dart:convert';
class User {
  String name;
  int age;
  List skills;

  User({required this.name, required this.age, required this.skills});

  // JSONからUserオブジェクトを生成
  factory User.fromJson(Map json) {
    return User(
      name: json['name'],
      age: json['age'],
      skills: List.from(json['skills']),
    );
  }

  // UserオブジェクトをJSONに変換
  Map toJson() {
    return {
      'name': name,
      'age': age,
      'skills': skills,
    };
  }
}

void main() {
  String jsonString = '{"name": "Otani", "age": 30, "skills": ["Picher", "Batter"]}';

  // JSON文字列をMapに変換(キーの値はDynamicにして様々な型に対応できるようにしておく)
  Map userMap = jsonDecode(jsonString);

  // MapからUserオブジェクトを生成
  User user = User.fromJson(userMap);

  print(user.name);  // Otani
  print(user.skills); // [Picher, Batter]

  // UserオブジェクトをJSON文字列に変換
  String newJsonString = jsonEncode(user.toJson());
  print(newJsonString);
  // {"name":"Otani","age":30,"skills":["Picher","Batter"]}
}

自分で、変換するコードを書くのが面倒な人向け(ただし、動かすまで大変だった)
1.dartプロジェクトを作成する。
dart crate my_project
my_projectフォルダをVS Codeで開く。

2.コードを書く

(lib/my_project.dart)
import 'package:json_annotation/json_annotation.dart';

part 'my_project.g.dart';

@JsonSerializable()
class User {
String name;
int age;
List skills;

User({required this.name, required this.age, required this.skills});

factory User.fromJson(Map json) => _$UserFromJson(json);
Map toJson() => _$UserToJson(this);
}

(bin/my_project.dart)
import 'package:my_project/my_project.dart';

void main() {
var user = User(name: 'Otani', age: 30, skills: ['Picher', 'Batter']);
print(user.toJson());
}

3.3つのパッケージを導入する。(2つ目と3つ目はdev_dependencies:に置かれる)
dart pub add json_annotation
dart pub add dev:build_runner
dart pub add dev:json_serializable

4.build_runnerを起動する
dart run build_runner build

これでdart runで行けると思います。

類似投稿

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.