在 Dart 中使用唯一键解析 JSON 对象

Parsing JSON Object with unique key in Dart

我很难弄清楚如何将具有唯一键的 JSON 响应解析到嵌套对象中。

我做了一些研究并看到了这篇文章 (https://medium.com/flutter-community/parsing-complex-json-in-flutter-747c46655f51),但它没有给出带有 unique/random 键的 JSON 对象的示例。

请参阅下文,了解我从后端获得的 json 响应。学生用户名是唯一的(即 john354、kim553 等),并且可以随时添加新学生。有人能给我一个例子,说明我的模型对于这种类型的结构应该是什么样子,以及如何用 listview.builder 显示数据吗?非常感谢!

{
    "school": {
        "students": {
            "john354": {
                "fullName": "John Kindle",  
                "permissions": {
                    "permission1": "here",
                    "permission2": "here"
                }
            },
            "kim553": {
                "fullName": "Kim Johnson"
                "permissions": {
                    "permission1": "here",
                    "permission2": "here"
                }
            },
            "dory643": {
                "fullName": "Dory Thomas"
                "permissions": {
                    "permission1": "here",
                    "permission2": "here"
                }
            }
        },
        "footer": "Text goes here"
    },
    "status": {
        "state": "open"
    }
}

尝试数据模型

class School {
  School school;
  Status status;

  School({this.school, this.status});

  School.fromJson(Map<String, dynamic> json) {
    school =
        json['school'] != null ? new School.fromJson(json['school']) : null;
    status =
        json['status'] != null ? new Status.fromJson(json['status']) : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.school != null) {
      data['school'] = this.school.toJson();
    }
    if (this.status != null) {
      data['status'] = this.status.toJson();
    }
    return data;
  }
}

class School {
  Students students;
  String footer;

  School({this.students, this.footer});

  School.fromJson(Map<String, dynamic> json) {
    students = json['students'] != null
        ? new Students.fromJson(json['students'])
        : null;
    footer = json['footer'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    if (this.students != null) {
      data['students'] = this.students.toJson();
    }
    data['footer'] = this.footer;
    return data;
  }
}

class Students {
  final String username;
  final Info info;
  
  Options({this.username,this.info});
    
factory Students.fromJson(String name, Map<String, dynamic> json){
    return Students(
      username: username,
      info: Info(
        fullName: json['info']['fullName']
        )
    );
} 
}

class Info {
  String fullName;
  Permissions permissions;

  Info({this.fullName, this.permissions});

  Info.fromJson(Map<String, dynamic> json) {
    fullName = json['fullName'];
    permissions = json['permissions'] != null
        ? new Permissions.fromJson(json['permissions'])
        : null;
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['fullName'] = this.fullName;
    if (this.permissions != null) {
      data['permissions'] = this.permissions.toJson();
    }
    return data;
  }
}

class Permissions {
  String permission1;
  String permission2;

  Permissions({this.permission1, this.permission2});

  Permissions.fromJson(Map<String, dynamic> json) {
    permission1 = json['permission1'];
    permission2 = json['permission2'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['permission1'] = this.permission1;
    data['permission2'] = this.permission2;
    return data;
  }
}

class Status {
  String state;

  Status({this.state});

  Status.fromJson(Map<String, dynamic> json) {
    state = json['state'];
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['state'] = this.state;
    return data;
  }
}

为了简化 JSON 追求,您可以使用 app.quicktype.io 将 JSON 转换为 DART。

试试下面的数据模型,

import 'dart:convert';

School schoolFromJson(String str) => School.fromJson(json.decode(str));

String schoolToJson(School data) => json.encode(data.toJson());

class School {
    School({
        this.school,
        this.status,
    });

    final SchoolClass school;
    final Status status;

    factory School.fromJson(Map<String, dynamic> json) => School(
        school: SchoolClass.fromJson(json["school"]),
        status: Status.fromJson(json["status"]),
    );

    Map<String, dynamic> toJson() => {
        "school": school.toJson(),
        "status": status.toJson(),
    };
}

class SchoolClass {
    SchoolClass({
        this.students,
        this.footer,
    });

    final Map<String, Student> students;
    final String footer;

    factory SchoolClass.fromJson(Map<String, dynamic> json) => SchoolClass(
        students: Map.from(json["students"]).map((k, v) => MapEntry<String, Student>(k, Student.fromJson(v))),
        footer: json["footer"],
    );

    Map<String, dynamic> toJson() => {
        "students": Map.from(students).map((k, v) => MapEntry<String, dynamic>(k, v.toJson())),
        "footer": footer,
    };
}

class Student {
    Student({
        this.fullName,
        this.permissions,
    });

    final String fullName;
    final Permissions permissions;

    factory Student.fromJson(Map<String, dynamic> json) => Student(
        fullName: json["fullName"],
        permissions: Permissions.fromJson(json["permissions"]),
    );

    Map<String, dynamic> toJson() => {
        "fullName": fullName,
        "permissions": permissions.toJson(),
    };
}

class Permissions {
    Permissions({
        this.permission1,
        this.permission2,
    });

    final String permission1;
    final String permission2;

    factory Permissions.fromJson(Map<String, dynamic> json) => Permissions(
        permission1: json["permission1"],
        permission2: json["permission2"],
    );

    Map<String, dynamic> toJson() => {
        "permission1": permission1,
        "permission2": permission2,
    };
}

class Status {
    Status({
        this.state,
    });

    final String state;

    factory Status.fromJson(Map<String, dynamic> json) => Status(
        state: json["state"],
    );

    Map<String, dynamic> toJson() => {
        "state": state,
    };
}

要解析此 JSON 数据,请执行 final school = schoolFromJson(jsonString);