解析 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<dynamic>
不是类型List<Person>
的子类型
我的代码有什么问题。有什么建议吗?
【问题讨论】:
使用这个转换器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<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();
【讨论】:
【参考方案3】:不要手动将 JSON 转换为 dart 对象。因为有时 JSON 响应非常复杂,所以可能会发生您可以编写不正确的数据类型。所以总是使用在线JSON to Dart Convertor。它可以免费使用。这将减少出错的机会。
【讨论】:
以上是关于解析 JSON 以转换为模型类的主要内容,如果未能解决你的问题,请参考以下文章
如何以角度将 JSON 对象数组转换为 Observable 数组