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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM