Flutter 中的 Json 解析:List<dynamic> 不是 'Map<String,dynamic>' 类型的子类型
Posted
技术标签:
【中文标题】Flutter 中的 Json 解析:List<dynamic> 不是 \'Map<String,dynamic>\' 类型的子类型【英文标题】:Json Parsing in Flutter: List<dynamic > is not a subtype of type 'Map<String,dynamic>'Flutter 中的 Json 解析:List<dynamic> 不是 'Map<String,dynamic>' 类型的子类型 【发布时间】:2021-12-23 02:18:20 【问题描述】:首先,我对使用 HTTP 请求和其他东西非常陌生。
我在 Java Spring 中创建了一个 API,并且我有一堆健身程序分配给一个用户,但是当我尝试从 Flutter 中的 JSON 获取对象时会出现此错误。我使用 http 并转换 dart 包。
List 不是类型 'Map
问题出在这一行:
var userModel = Users.fromJson(jsonMap);
这是 getUsers 方法:
Future<Users> getUsers() async
var client = http.Client();
var userModel = null;
var response = await client.get(Uri.parse(Strings.users_url));
try
if (response.statusCode == 200)
var jsonString = response.body;
var jsonMap = json.decode(jsonString);
print(jsonMap);
var userModel = Users.fromJson(jsonMap);
catch(Exception)
print(Exception);
return userModel;
return userModel;
这些是用户和健身计划课程:
// To parse this JSON data, do
//
// final users = usersFromJson(jsonString);
import 'dart:convert';
List<Users> usersFromJson(String str) => List<Users>.from(json.decode(str).map((x) => Users.fromJson(x)));
String usersToJson(List<Users> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class Users
Users(
this.id,
this.email,
this.password,
this.firstName,
this.lastName,
this.birthday,
this.weight,
this.height,
this.fitnessProgrammes,
);
int id;
String email;
String password;
String firstName;
String lastName;
dynamic birthday;
int weight;
int height;
List<FitnessProgramme> fitnessProgrammes;
factory Users.fromJson(Map<String, dynamic> json) => Users(
id: json["id"],
email: json["email"],
password: json["password"],
firstName: json["firstName"],
lastName: json["lastName"],
birthday: json["birthday"],
weight: json["weight"],
height: json["height"],
fitnessProgrammes: List<FitnessProgramme>.from(json["fitnessProgrammes"].map((x) => FitnessProgramme.fromJson(x))),
);
Map<String, dynamic> toJson() =>
"id": id,
"email": email,
"password": password,
"firstName": firstName,
"lastName": lastName,
"birthday": birthday,
"weight": weight,
"height": height,
"fitnessProgrammes": List<dynamic>.from(fitnessProgrammes.map((x) => x.toJson())),
;
class FitnessProgramme
FitnessProgramme(
this.id,
this.name,
this.trainingDifficulty,
);
int id;
String name;
String trainingDifficulty;
factory FitnessProgramme.fromJson(Map<String, dynamic> json) => FitnessProgramme(
id: json["id"],
name: json["name"],
trainingDifficulty: json["trainingDifficulty"],
);
Map<String, dynamic> toJson() =>
"id": id,
"name": name,
"trainingDifficulty": trainingDifficulty,
;
【问题讨论】:
***.com/questions/51854891/…你检查过这个链接吗? 【参考方案1】:您的 API 可能返回一组用户而不是单个用户。所以解码后的 JSON 类型是List<Map<String, dynamic>>
。要解决这个问题,要么遍历每个用户并实例化他们,要么让你的 API 只返回一个特定的用户。
下面的代码可能会起作用并实例化 API 返回的第一个用户:
var userModel = Users.fromJson(jsonMap[0]);
【讨论】:
以上是关于Flutter 中的 Json 解析:List<dynamic> 不是 'Map<String,dynamic>' 类型的子类型的主要内容,如果未能解决你的问题,请参考以下文章