解析JSON以转换为Model类

时间:2019-12-09 09:49:53

标签: json flutter dart

我无法将服务器响应转换为模型类。以下是我的代码。

void main() {

  //JSON to parse
  var strJson = """{
  \"person\": [
      {\"name\": \"Mahendra\", \"age\": 28},
      {\"name\": \"Test\", \"age\": 25}
    ]
  }""";

  var data = json.decode(strJson);
  print("json: $data");

  var result = PersonResponse<Person>.fromJSON(data);
  print("result: ${result.persons}");

}

模型类

class Person {
  String name;
  int age;

  Person.fromJSON(Map json) {
    this.name = json["name"];
    this.age = json["age"];
  }
}

class PersonResponse<T> {

  List<T> persons;

  PersonResponse.fromJSON(Map json) {
    this.persons = json["person"];
  }
}

运行此代码时,无法将服务器响应转换为模型类。出现以下错误...

  

未处理的异常:类型List<dynamic>不是类型List<Person>的子类型

我的代码有什么问题。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

尝试

// To parse this JSON data, do
//
//     final person = personFromJson(jsonString);

import 'dart:convert';

Person personFromJson(String str) => Person.fromJson(json.decode(str));

String personToJson(Person data) => json.encode(data.toJson());

class Person {
    List<PersonElement> person;

    Person({
        this.person,
    });

    factory Person.fromJson(Map<String, dynamic> json) => Person(
        person: List<PersonElement>.from(json["person"].map((x) => PersonElement.fromJson(x))),
    );

    Map<String, dynamic> toJson() => {
        "person": List<dynamic>.from(person.map((x) => x.toJson())),
    };
}

class PersonElement {
    String name;
    int age;

    PersonElement({
        this.name,
        this.age,
    });

    factory PersonElement.fromJson(Map<String, dynamic> json) => PersonElement(
        name: json["name"],
        age: json["age"],
    );

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

答案 1 :(得分:1)

我找到3个选择:

  • 您可以放弃使用泛型,而可以将List<T> persons;替换为List<dynamic> persons;。实际上,您的代码仅适用于此更改。

  • 您可以放弃使用泛型,而将List<T> persons;替换为List<Person>并将其映射到fromJson中。

class PersonResponse {

  List<Person> persons;

  PersonResponse.fromJSON(Map json) {
    List<dynamic> list = json["person"];
    persons = list.map((element) => Person.fromJSON(element)).toList();
  }
}
  • 保留泛型,但限于可序列化的内容,例如:
class PersonResponse<T extends JsonSerializable> {
  List<T> persons;

  PersonResponse.fromJSON(Map json) {
    List<dynamic> list = json["person"];
    persons = list.map((element) => T.fromJSON(element)).toList();
  }
}

答案 2 :(得分:0)

不要手动将 JSON 转换为 dart 对象。因为有些时候 JSON 响应非常复杂,所以可能会发生你写不正确的数据类型。所以总是使用在线JSON to Dart Convertor。它可以免费使用。这将减少出错的机会。