JSONの解析と生成(Dart)

課題

- JSON形式の文字列をUsersクラス(構造体)のオブジェクトに逆シリアル化し、そのオブジェクトを再びJSON文字列にシリアル化する。 - Usersクラス(構造体)は、Userクラス(構造体)のusers配列を1つのフィールドとして含む。 - Userクラス(構造体)には2つのフィールドが存在する:name(文字列型)とage(整数型)。

プロジェクト作成

Intellij IDEAを開き、Dartプラグインをインストールします。
新しいプロジェクトを作成し、Dart -> Dart Command Line Appを選択します。Dart SDKパスを指定後、「Next」をクリックし、プロジェクト名を「example」として設定します。

依存関係の追加

pubspec.yamlのdependenciesセクションに以下の依存関係を追加します:

dependencies:
  json_annotation: ^3.0.0
  analyzer: '0.39.14'
ファイル上部の「Pub get」リンクをクリックして依存関係をダウンロードします。

Dartコード

以下はexample.dartのコード例です。

import 'dart:convert';
import 'package:json_annotation/json_annotation.dart';

part 'example.g.dart';

@JsonSerializable()
class Users {
  List<User> users;

  Users(this.users);
  
  factory Users.fromJson(Map json) => _$UsersFromJson(json);
  Map toJson() => _$UsersToJson(this);

  @override
  String toString() => "users=$users";
}

@JsonSerializable()
class User {
  @JsonKey(name: 'user_name')
  String name;
  int age;

  User(this.name, this.age);

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

  @override
  String toString() => "name=${name}, age=${age}";
}

void main() {
  final jsonString = '''
{
  "users": [
    {
      "user_name": "Alice",
      "age": 25
    }
  ]
}
''';

  final decodedJson = jsonDecode(jsonString) as Map;
  final userObject = Users.fromJson(decodedJson);
  print(userObject);

  final serializedJson = jsonEncode(userObject);
  print(serializedJson);

  final prettyJson = JsonEncoder.withIndent('  ').convert(userObject);
  print(prettyJson);
}

JSON変換用コードの生成

プロジェクトのルートディレクトリで以下のコマンドを実行します:

pub run build_runner build
このコマンドによりexample.g.dartファイルが生成されます。

// GENERATED CODE - DO NOT MODIFY BY HAND

part of 'example.dart';

// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************

Users _$UsersFromJson(Map json) {
  return Users(
    (json['users'] as List)
        ?.map((e) => e == null ? null : User.fromJson(e as Map))
        ?.toList(),
  );
}

Map _$UsersToJson(Users instance) => {
      'users': instance.users,
    };

User _$UserFromJson(Map json) {
  return User(
    json['user_name'] as String,
    json['age'] as int,
  );
}

Map _$UserToJson(User instance) => {
      'user_name': instance.name,
      'age': instance.age,
    };

出力結果

プログラムを実行すると、以下の出力が得られます:

users=[name=Alice, age=25]
{"users":[{"user_name":"Alice","age":25}]}
{
  "users": [
    {
      "user_name": "Alice",
      "age": 25
    }
  ]
}

タグ: Dart json_annotation build_runner

7月7日 21:46 投稿