我有一个 .net 服务器 web api 调用,我正在尝试将客户端部分从 Xamarin 移植到 Flutter。除了 json 序列化/反序列化很痛苦之外,flutter/Dart 给人留下了最深刻的印象!我的 api 返回具有嵌入式机器列表的锻炼例程列表。这是非常简单和正常的东西。我生成的 JSON 看起来像:
[
{"id":1,"
Name":"back",
"userid":1,
"cloned":0,
"Machines":
[
{"machineid":2,
"Name":"Leg Extension","PictureUrl":"https://l},
{"machineid":3,"Name":"yoga ball","PictureUrl":"https://
}
我最初尝试使用 dart.convert 的手动方法,结果对我序列化例程列表很有效。但是后来我决定使用描述的代码生成 here当我调用 jsonDecode 时,我的代码通过以下异常:
类型“List”不是类型“Map”的子类型
我的 Flutter UI 代码如下所示:
_fetchData() async {
setState(() {
isLoading = true;
});
final response =
await http.get("http://fitnesspal.azurewebsites.net/api/routines");
if (response.statusCode == 200) {
// list = (json.decode(response.body) as List)
// .map((data) => new Routine.fromJson(data))
// .toList();
// final jsonResponse = json.decode(response.body);
try {
String json1 = response.body;
Map map1 = jsonDecode(json1);
var test = Routine.fromJson(map1);
}
catch (e) {
print(e.toString());
}
setState(() {
isLoading = false;
});
} else {
throw Exception('Failed to load photos');
}
import 'package:json_annotation/json_annotation.dart';
import 'package:fitnesspal/Models/Machine.dart';
part 'Routine.g.dart';
@JsonSerializable(nullable: false)
class Routine{
final int id;
final String name;
@JsonKey(name: 'Machines')
List<Machine> Machines;
Routine({this.id,this.name,this.Machines});
factory Routine.fromJson(Map<String, dynamic> json) =>
_$RoutineFromJson(json);
Map<String, dynamic> toJson() => _$RoutineToJson(this);
}
我遵循了描述的代码生成步骤
最佳答案
这不起作用,因为 json1 是对象的 List
,而不是 Map。
Map map1 = jsonDecode(json1);
尝试使用这个:
List list = jsonDecode(json1);
并获取第一个元素只是为了测试(在真实场景中你将不得不循环列表)
var test = Routine.fromJson(list[0]);
关于serialization - flutter 序列化儿子列出对象抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54612725/