解析 JSON 以转换为模型类

Posted

技术标签:

【中文标题】解析 JSON 以转换为模型类【英文标题】:Parse JSON to convert into Model class 【发布时间】:2020-04-02 09:37:53 【问题描述】:

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

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&lt;dynamic&gt; 不是类型 List&lt;Person&gt; 的子类型

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

【问题讨论】:

使用这个转换器javiercbk.github.io/json_to_dart 这能回答你的问题吗? How to decode JSON in Flutter? 【参考方案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,
    ;

【讨论】:

【参考方案2】:

我找到了 3 个选项:

您可以放弃使用泛型并将List&lt;T&gt; persons; 替换为List&lt;dynamic&gt; persons;。您的代码实际上仅适用于此更改。

您可以放弃使用泛型并将List&lt;T&gt; persons; 替换为List&lt;Person&gt; 并将其映射到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();
  

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于解析 JSON 以转换为模型类的主要内容,如果未能解决你的问题,请参考以下文章

Flutter JSON解析与复杂模型转换技巧

如何以角度将 JSON 对象数组转换为 Observable 数组

如何将此 JSON 格式转换为模型类并使用改造将响应转换为列表

如何以角度解开 Json 数据?

如何将带单引号的字符串转换为双引号以进行 json 解析

Flutter:将 50 多个模型类转换为支持 json_serializable 的快速方法