Flutter:无法使用 dio 获取数组 json 到对象列表
Flutter : Can't get array json using dio to list of object
我尝试加载数组 json(没有键的数组)并获取到对象列表,这是我的示例代码:
我的 ApiCliet :
Future<List<OnBoardingModel>> fetchOnboarding() async {
try {
Response response = await dio.get("api/OnboardingItem");
return OnBoardingModel.fromJson(response.data) as List;
} catch (error, stacktrace) {
throw Exception("Exception occured: $error stackTrace: $stacktrace");
}
}
我的对象(使用quicktype生成):
List<OnBoardingModel> onBoardingModelFromJson(String str) => List<OnBoardingModel>.from(json.decode(str).map((x) => OnBoardingModel.fromJson(x)));
String onBoardingModelToJson(List<OnBoardingModel> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class OnBoardingModel {
OnBoardingModel({
this.id,
this.judul,
this.deskripsi,
this.urlGambar,
});
int id;
String judul;
String deskripsi;
String urlGambar;
factory OnBoardingModel.fromJson(Map<String, dynamic> json) => OnBoardingModel(
id: json["id"],
judul: json["judul"],
deskripsi: json["deskripsi"],
urlGambar: json["urlGambar"],
);
Map<String, dynamic> toJson() => {
"id": id,
"judul": judul,
"deskripsi": deskripsi,
"urlGambar": urlGambar,
};
}
最后我得到一个错误显示:Exception: Exception occured: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>' stackTrace: #0
,参考这一行return OnBoardingModel.fromJson(response.data) as List;
你能帮我解决这个问题吗?我谢谢你
更新
我的json格式:
[
{
"id": 0,
"judul": "string",
"deskripsi": "string",
"urlGambar": "string"
}
]
导入'dart:convert';
List<Welcome> welcomeFromJson(String str) => List<Welcome>.from(json.decode(str).map((x) => Welcome.fromJson(x)));
String welcomeToJson(List<Welcome> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class Welcome {
Welcome({
this.id,
this.judul,
this.deskripsi,
this.urlGambar,
});
int id;
String judul;
String deskripsi;
String urlGambar;
factory Welcome.fromJson(Map<String, dynamic> json) => Welcome(
id: json["id"],
judul: json["judul"],
deskripsi: json["deskripsi"],
urlGambar: json["urlGambar"],
);
Map<String, dynamic> toJson() => {
"id": id,
"judul": judul,
"deskripsi": deskripsi,
"urlGambar": urlGambar,
};
}
最后的欢迎 = welcomeFromJson(jsonString);
最后我得到了答案,只需用这个替换 return :
return (response.data as List)
.map((x) => OnBoardingModel.fromJson(x))
.toList();
完整代码:
Future<List<OnBoardingModel>> fetchOnboarding() async {
try {
Response response = await dio.get("api/OnboardingItem");
// if there is a key before array, use this : return (response.data['data'] as List).map((child)=> Children.fromJson(child)).toList();
return (response.data as List)
.map((x) => OnBoardingModel.fromJson(x))
.toList();
} catch (error, stacktrace) {
throw Exception("Exception occured: $error stackTrace: $stacktrace");
}
}
希望这个回答能帮助到其他flutter新手。
我尝试加载数组 json(没有键的数组)并获取到对象列表,这是我的示例代码:
我的 ApiCliet :
Future<List<OnBoardingModel>> fetchOnboarding() async {
try {
Response response = await dio.get("api/OnboardingItem");
return OnBoardingModel.fromJson(response.data) as List;
} catch (error, stacktrace) {
throw Exception("Exception occured: $error stackTrace: $stacktrace");
}
}
我的对象(使用quicktype生成):
List<OnBoardingModel> onBoardingModelFromJson(String str) => List<OnBoardingModel>.from(json.decode(str).map((x) => OnBoardingModel.fromJson(x)));
String onBoardingModelToJson(List<OnBoardingModel> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class OnBoardingModel {
OnBoardingModel({
this.id,
this.judul,
this.deskripsi,
this.urlGambar,
});
int id;
String judul;
String deskripsi;
String urlGambar;
factory OnBoardingModel.fromJson(Map<String, dynamic> json) => OnBoardingModel(
id: json["id"],
judul: json["judul"],
deskripsi: json["deskripsi"],
urlGambar: json["urlGambar"],
);
Map<String, dynamic> toJson() => {
"id": id,
"judul": judul,
"deskripsi": deskripsi,
"urlGambar": urlGambar,
};
}
最后我得到一个错误显示:Exception: Exception occured: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>' stackTrace: #0
,参考这一行return OnBoardingModel.fromJson(response.data) as List;
你能帮我解决这个问题吗?我谢谢你
更新
我的json格式:
[
{
"id": 0,
"judul": "string",
"deskripsi": "string",
"urlGambar": "string"
}
]
导入'dart:convert';
List<Welcome> welcomeFromJson(String str) => List<Welcome>.from(json.decode(str).map((x) => Welcome.fromJson(x)));
String welcomeToJson(List<Welcome> data) => json.encode(List<dynamic>.from(data.map((x) => x.toJson())));
class Welcome {
Welcome({
this.id,
this.judul,
this.deskripsi,
this.urlGambar,
});
int id;
String judul;
String deskripsi;
String urlGambar;
factory Welcome.fromJson(Map<String, dynamic> json) => Welcome(
id: json["id"],
judul: json["judul"],
deskripsi: json["deskripsi"],
urlGambar: json["urlGambar"],
);
Map<String, dynamic> toJson() => {
"id": id,
"judul": judul,
"deskripsi": deskripsi,
"urlGambar": urlGambar,
};
}
最后的欢迎 = welcomeFromJson(jsonString);
最后我得到了答案,只需用这个替换 return :
return (response.data as List)
.map((x) => OnBoardingModel.fromJson(x))
.toList();
完整代码:
Future<List<OnBoardingModel>> fetchOnboarding() async {
try {
Response response = await dio.get("api/OnboardingItem");
// if there is a key before array, use this : return (response.data['data'] as List).map((child)=> Children.fromJson(child)).toList();
return (response.data as List)
.map((x) => OnBoardingModel.fromJson(x))
.toList();
} catch (error, stacktrace) {
throw Exception("Exception occured: $error stackTrace: $stacktrace");
}
}
希望这个回答能帮助到其他flutter新手。