Flutter json解码_TypeError(类型'List<dynamic>'不是类型'Map<dynamic, dynamic>'的子类型)
Flutter json Decoding _TypeError (type 'List<dynamic>' is not a subtype of type 'Map<dynamic, dynamic>')
所以我知道这个错误是什么,我需要做什么,但我不明白如何做我想做的事。
所以我正在使用 html api 服务器调用,其中 returns 一个 jsonEncoded 地图对象列表。
每个列表的大小可以(而且将会)改变,所以我不能有一个只检查和解码前几个或其他东西的函数。此外,每个 Map 对象可能包含不同的信息,所以我不能让它静态解析。我需要对整个列表进行 jsonDecode,并将其转换回单独的 Map 对象列表,以便我可以在我的程序的其余部分中使用 Map 对象中包含的信息。
出于隐私原因,我无法提供我收到的对象类型的示例(或任何类似内容),对于给您带来的不便以及尝试回答问题的难度增加,我深表歉意。
就是说,我知道我只需要一个函数来检查列表中有多少个对象,将 response.body 拆分成那么多块,将每个块解码成一个 Map 对象,然后添加它到列表或数组。
您可以提供的任何信息(即使不是特定代码)都会有所帮助,即使只是告诉我应该查看哪些命令。 (最好有一个语法示例,但当然不是强制性的)。
如果您需要我可以提供的任何信息,我将很乐意提供。提前谢谢你。
你问题的问题是我们甚至不知道你传入数据的一般结构。我们作为一个社区不需要知道一个实际的例子。即使是伪造的数据也足够了。
话虽这么说,但我将尝试为您提供一些示例,说明您的传入数据可能是什么,以及您如何做您正在尝试做的事情。
传入JSON对象
假设您的传入数据如下所示:
{
"data1": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
},
"data2": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
}
}
在这种情况下,您可以使用 json解码,并且仍然能够计算键和 return 关联的对象列表,如下所示:
void consumeResponse(http.Response response) {
// decode the entire response string
final Map<String, dynamic> rawObject = jsonDecode(response.body);
// count the records in the response
final int recordCount = rawObject.keys.length;
// create an array of the data in each top level object key (but you lose the top level key name)
final List<dynamic> records = List<dynamic>.from(rawObject.values);
}
传入JSON对象数组
假设您的 json 实际上已经在 json 数组中,并且您的响应如下所示:
[
{
"data1": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
}
},
{
"data2": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
}
}
]
然后你可以用这个函数完成同样的事情:
void consumeResponse(http.Response response) {
// decode the entire response string. this will auto-magically produce a List<dynamic>
final List<dynamic> records = jsonDecode(response.body);
// count the records in the response
final int recordCount = records.length;
}
传入的 JSON 带有数据子列表的对象
在某些情况下,您可能会在包装 json 对象中嵌入一个结果列表,该对象还包含一些关于您的查询的额外元数据。在这种情况下,您的数据可能如下所示:
{
"meta": {
"limit": 2,
"offset": 1,
"total": 47
},
"results": [
{
"data1": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
}
},
{
"data2": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
}
}
]
}
在这种情况下,您可能希望 运行 键 results
中的子列表具有相同的功能。您也可以使用类似的功能来做到这一点:
void consumeResponse(http.Response response) {
// decode the entire response string
final Map<String, dynamic> rawObject = jsonDecode(response.body);
// create the List<dynamic> from the results list in the sub object
final List<dynamic> records = rawObject['results'];
// count the records in the response
final int recordCount = records.length;
}
关闭
希望,即使您的问题很模糊,但您至少可以使用这些场景中的一种。如果可以的话,创建一些可以分享的 "mock data" and/or "mock code" 总是更好。该社区使用所有可用数据来构建他们的答案。您向我们提供的数据越多,您得到的答案就越好。
所以我知道这个错误是什么,我需要做什么,但我不明白如何做我想做的事。
所以我正在使用 html api 服务器调用,其中 returns 一个 jsonEncoded 地图对象列表。
每个列表的大小可以(而且将会)改变,所以我不能有一个只检查和解码前几个或其他东西的函数。此外,每个 Map 对象可能包含不同的信息,所以我不能让它静态解析。我需要对整个列表进行 jsonDecode,并将其转换回单独的 Map 对象列表,以便我可以在我的程序的其余部分中使用 Map 对象中包含的信息。
出于隐私原因,我无法提供我收到的对象类型的示例(或任何类似内容),对于给您带来的不便以及尝试回答问题的难度增加,我深表歉意。
就是说,我知道我只需要一个函数来检查列表中有多少个对象,将 response.body 拆分成那么多块,将每个块解码成一个 Map 对象,然后添加它到列表或数组。
您可以提供的任何信息(即使不是特定代码)都会有所帮助,即使只是告诉我应该查看哪些命令。 (最好有一个语法示例,但当然不是强制性的)。
如果您需要我可以提供的任何信息,我将很乐意提供。提前谢谢你。
你问题的问题是我们甚至不知道你传入数据的一般结构。我们作为一个社区不需要知道一个实际的例子。即使是伪造的数据也足够了。
话虽这么说,但我将尝试为您提供一些示例,说明您的传入数据可能是什么,以及您如何做您正在尝试做的事情。
传入JSON对象
假设您的传入数据如下所示:
{
"data1": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
},
"data2": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
}
}
在这种情况下,您可以使用 json解码,并且仍然能够计算键和 return 关联的对象列表,如下所示:
void consumeResponse(http.Response response) {
// decode the entire response string
final Map<String, dynamic> rawObject = jsonDecode(response.body);
// count the records in the response
final int recordCount = rawObject.keys.length;
// create an array of the data in each top level object key (but you lose the top level key name)
final List<dynamic> records = List<dynamic>.from(rawObject.values);
}
传入JSON对象数组
假设您的 json 实际上已经在 json 数组中,并且您的响应如下所示:
[
{
"data1": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
}
},
{
"data2": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
}
}
]
然后你可以用这个函数完成同样的事情:
void consumeResponse(http.Response response) {
// decode the entire response string. this will auto-magically produce a List<dynamic>
final List<dynamic> records = jsonDecode(response.body);
// count the records in the response
final int recordCount = records.length;
}
传入的 JSON 带有数据子列表的对象
在某些情况下,您可能会在包装 json 对象中嵌入一个结果列表,该对象还包含一些关于您的查询的额外元数据。在这种情况下,您的数据可能如下所示:
{
"meta": {
"limit": 2,
"offset": 1,
"total": 47
},
"results": [
{
"data1": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
}
},
{
"data2": {
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":{
"subsubdata1":"subvalue1"
}
}
}
]
}
在这种情况下,您可能希望 运行 键 results
中的子列表具有相同的功能。您也可以使用类似的功能来做到这一点:
void consumeResponse(http.Response response) {
// decode the entire response string
final Map<String, dynamic> rawObject = jsonDecode(response.body);
// create the List<dynamic> from the results list in the sub object
final List<dynamic> records = rawObject['results'];
// count the records in the response
final int recordCount = records.length;
}
关闭
希望,即使您的问题很模糊,但您至少可以使用这些场景中的一种。如果可以的话,创建一些可以分享的 "mock data" and/or "mock code" 总是更好。该社区使用所有可用数据来构建他们的答案。您向我们提供的数据越多,您得到的答案就越好。