【发布时间】:2022-01-10 21:01:18
【问题描述】:
我想反序列化一个 JSON 对象数组。我遵循了 Flutter 文档中的 this 教程。问题是,这个数组嵌套在另一个对象中,看起来像这样:
{
"result":
{
"array":
[
{
"id": 0,
"name": "here goes the string"
},
{
"id": 1,
"name": "another one here"
} ...
我一直在关注this官方教程,但遇到了一个错误:
I/flutter (28639): AsyncSnapshot
(ConnectionState.done, null, Exception: NoSuchMethodError: Class '_InternalLinkedHashMap
' 没有具有匹配参数的实例方法 'cast'。 I/flutter (28639):接收器:_LinkedHashMap len:2
I/flutter (28639):尝试调用:cast
I/flutter (28639): 发现: cast
() => Map , #0 Object.noSuchMethod (dart:core-patch/object_patch.dart:68:5)
我希望我对反序列化 JSON Map<String, dynamic> 的东西的 .result.array[] 引用不佳,尽管错误在前面出现了一行,我完全不知道是什么原因造成的。这个异常的原因可能是什么,我是否以一种好的方式引用数组?
我的应用基本上是这样的(我已经用箭头 (→) 标记了抛出异常的行:
/* [...] */
Future<List<Models.Degree>> fetchDegrees(http.Client client) async
{
final response = await client
.get(Uri.parse("api uri here"));
// Using the compute function to run in a separate isolate.
return compute(parseDegrees, response.body);
}
List<Models.Degree> parseDegrees(String responseBody)
{
→ final parsed = jsonDecode(responseBody).cast<Map<String, dynamic>>();
return parsed['result']['array'].map<Models.Degree>((json) => Models.Degree.fromJson(json)).toList();
}
/* [...] */
class MyHomePage extends StatelessWidget {
const MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(title),
),
body: FutureBuilder<List<Models.Degree>>(
future: fetchDegrees(http.Client()),
builder: (context, snapshot) {
if (snapshot.hasError) {
print(snapshot.toString());
return const Center(
child: Text('An error has occurred!'),
);
} else if (snapshot.hasData) {
return DegreesList(degrees: snapshot.data!);
} else {
return const Center(
child: CircularProgressIndicator(),
);
}
},
),
);
}
}
class DegreesList extends StatelessWidget {
const DegreesList({Key? key, required this.degrees}) : super(key: key);
final List<Models.Degree> degrees;
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: degrees.length,
itemBuilder: (context, index) {
return Text(degrees[index].name);
},
);
}
}
【问题讨论】: