課題
- 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
}
]
}