openplanning

Bài thực hành Dart phân tích JSON với gói dart:convert

  1. SquadMemberData
  2. SquadData
  3. Example
Trong bài học này chúng ta sẽ thực hành sử dụng gói thư viện dart:convert để phân tích một văn bản JSON thành các đối tượng Dart.
Tài liệu JSON dưới đây mô phỏng một biệt đội (Squad) và các thành viên. Chúng ta cần mô hình hoá nó dưới dạng các đối tượng Dart.
squad.json
{
  "squadName": "Super hero squad",
  "homeTown": "Metro City",
  "formed": 2016,
  "secretBase": "Super tower",
  "active": true,
  "members": [
    {
      "name": "Molecule Man",
      "age": 29,
      "secretIdentity": "Dan Jukes",
      "powers": [
        "Radiation resistance",
        "Turning tiny",
        "Radiation blast"
      ]
    },
    {
      "name": "Madame Uppercut",
      "age": 39,
      "secretIdentity": "Jane Wilson",
      "powers": [
        "Million tonne punch",
        "Damage resistance",
        "Superhuman reflexes"
      ]
    },
    {
      "name": "Eternal Flame",
      "age": 1000000,
      "secretIdentity": "Unknown",
      "powers": [
        "Immortality",
        "Heat Immunity",
        "Inferno",
        "Teleportation",
        "Interdimensional travel"
      ]
    }
  ]
}

1. SquadMemberData

Một văn bản JSON mang thông tin một thành viên của biệt đội (Squad).
{
  "name": "Molecule Man",
  "age": 29,
  "secretIdentity": "Dan Jukes",
  "powers": [
    "Radiation resistance",
    "Turning tiny",
    "Radiation blast"
  ]
}
Chúng ta mô hình hoá nó bằng lớp SquadMemberData. Phương thức tĩnh fromMap được sử dụng để chuyển đổi một đối tượng Map<String,dynamic> thành đối tượng SquadMemberData.
model_squad_member.dart
class SquadMemberData {
  String name;
  int age;
  String secretIdentity;

  List<String> powers = [];

  SquadMemberData(this.name, this.age, this.secretIdentity, this.powers);

  static SquadMemberData fromMap(Map<String, dynamic> map) {
    String name = map['name'];
    int age = map['age'];
    String secretIdentity = map['secretIdentity'];

    // List<dynamic> (***)
    List<dynamic> list = map['powers'];
    // Convert List<dynamic> to List<String>
    List<String> powers = list.map((e) => e as String).toList();

    return SquadMemberData(name, age, secretIdentity, powers);
  }
}

2. SquadData

Một văn bản JSON mang thông tin một biệt đội (Squad).
{
  "squadName": "Super hero squad",
  "homeTown": "Metro City",
  "formed": 2016,
  "secretBase": "Super tower",
  "active": true,
  "members": [
     {
       "name": "Molecule Man",
       "age": 29,
       "secretIdentity": "Dan Jukes",
       "powers": [
            "Radiation resistance",
            "Turning tiny",
            "Radiation blast"
       ]
     },
     ........
  ]
}
Mô hình hoá nó bởi lớp SquadData:
model_squad.dart
import 'dart:convert';

import 'model_squad_member.dart';

class SquadData {
  String squadName;
  String homeTown;
  int formed;
  String secretBase;
  bool active;

  List<SquadMemberData> members = [];

  SquadData({
    required this.squadName,
    required this.homeTown,
    required this.formed,
    required this.secretBase,
    required this.active,
    required this.members,
  });

  static SquadData fromMap(Map<String, dynamic> map) {
    String squadName = map['squadName'];
    String homeTown = map['homeTown'];
    int formed = map['formed'];
    String secretBase = map['secretBase'];
    bool active = map['active'];
    //
    List<dynamic> list = map['members'];

    List<SquadMemberData> squadMembers =
        list.map((dynamic e) => SquadMemberData.fromMap(e)).toList();

    return SquadData(
      squadName: squadName,
      homeTown: homeTown,
      formed: formed,
      secretBase: secretBase,
      active: active,
      members: squadMembers,
    );
  }

  static SquadData fromJsonString(String jsonString) {
    Map<String, dynamic> map = jsonDecode(jsonString);
    return fromMap(map);
  }
}

3. Example

squad_json_data.dart
String squadJson = '''
{
  "squadName": "Super hero squad",
  "homeTown": "Metro City",
  "formed": 2016,
  "secretBase": "Super tower",
  "active": true,
  "members": [
    {
      "name": "Molecule Man",
      "age": 29,
      "secretIdentity": "Dan Jukes",
      "powers": [
        "Radiation resistance",
        "Turning tiny",
        "Radiation blast"
      ]
    },
    {
      "name": "Madame Uppercut",
      "age": 39,
      "secretIdentity": "Jane Wilson",
      "powers": [
        "Million tonne punch",
        "Damage resistance",
        "Superhuman reflexes"
      ]
    },
    {
      "name": "Eternal Flame",
      "age": 1000000,
      "secretIdentity": "Unknown",
      "powers": [
        "Immortality",
        "Heat Immunity",
        "Inferno",
        "Teleportation",
        "Interdimensional travel"
      ]
    }
  ]
} 
''';
Chuyển đổi một văn bản JSON thành đối tượng Dart:
main.dart
import 'model_squad.dart';
import 'model_squad_member.dart';
import 'squad_json_data.dart';

void main() {
  var squad = SquadData.fromJsonString(squadJson);

  print('Squad Name: ${squad.squadName}');

  for (SquadMemberData member in squad.members) {
    print("Member: ${member.name} / age: ${member.age}");
    print("  POWERS:");
    for (String power in member.powers) {
      print("   - $power");
    }
  }
}
Output:
Squad Name: Super hero squad
Member: Molecule Man / age: 29
  POWERS:
   - Radiation resistance
   - Turning tiny
   - Radiation blast
Member: Madame Uppercut / age: 39
  POWERS:
   - Million tonne punch
   - Damage resistance
   - Superhuman reflexes
Member: Eternal Flame / age: 1000000
  POWERS:
   - Immortality
   - Heat Immunity
   - Inferno
   - Teleportation
   - Interdimensional travel