课题
- 将 JSON 字符串反序列化为 Persons 类(结构)的对象 ,然后将这个对象序列化为 JSON 字符串。
- Persons 类(结构)包含一个字段:Person 类(结构)的 persons 数组。
- Person 类(结构)包含两个字段:字符串类型的 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 Persons {
List<Person> persons;
Persons() {}
factory Persons.fromJson(Map<String, dynamic> json) => _$PersonsFromJson(json);
Map<String, dynamic> toJson() => _$PersonsToJson(this);
@override
String toString() => "persons=$persons";
}
@JsonSerializable()
class Person {
@JsonKey(name: 'name')
String name;
int age;
Person() {}
factory Person.fromJson(Map<String, dynamic> json) => _$PersonFromJson(json);
Map<String, dynamic> toJson() => _$PersonToJson(this);
@override
String toString() => "name=$name,age=$age";
}
void main() {
final jsonString = """
{
"persons" : [
{
"name" : "Joe",
"age" : 12
}
]
}
""";
final o = Persons.fromJson(jsonDecode(jsonString) as Map<String, dynamic>);
print(o);
final s = jsonEncode(o);
print(s);
final s2 = JsonEncoder.withIndent(" ").convert(o);
print(s2);
}
生成 json 转换的代码
在工程根目录下执行以下命令
pub run build_runner build
该命令会生成 example.g.dart 文件
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'example.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Persons _$PersonsFromJson(Map<String, dynamic> json) {
return Persons()
..persons = (json['persons'] as List)
?.map((e) =>
e == null ? null : Person.fromJson(e as Map<String, dynamic>))
?.toList();
}
Map<String, dynamic> _$PersonsToJson(Persons instance) => <String, dynamic>{
'persons': instance.persons,
};
Person _$PersonFromJson(Map<String, dynamic> json) {
return Person()
..name = json['name'] as String
..age = json['age'] as int;
}
Map<String, dynamic> _$PersonToJson(Person instance) => <String, dynamic>{
'name': instance.name,
'age': instance.age,
};
输出
程序执行后的输出为
persons=[name=Joe,age=12]
{"persons":[{"name":"Joe","age":12}]}
{
"persons": [
{
"name": "Joe",
"age": 12
}
]
}