zwvista

导航

JSON数据的解析和生成(Dart)

课题

  • 将 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
    }
  ]
}

posted on 2020-09-15 12:32  zwvista  阅读(2097)  评论(0编辑  收藏  举报