Flutter json解码_TypeError(类型'List <dynamic>'不是'Map <dynamic,dynamic>'类型的子类型)[关闭]
Posted
技术标签:
【中文标题】Flutter json解码_TypeError(类型\'List <dynamic>\'不是\'Map <dynamic,dynamic>\'类型的子类型)[关闭]【英文标题】:Flutter json Decoding _TypeError (type 'List<dynamic>' is not a subtype of type 'Map<dynamic, dynamic>') [closed]Flutter json解码_TypeError(类型'List <dynamic>'不是'Map <dynamic,dynamic>'类型的子类型)[关闭] 【发布时间】:2020-05-30 11:20:17 【问题描述】:所以这个错误我明白它是什么,我需要做什么,但我不明白如何做我想做的事。
所以我使用了一个 html api 服务器调用,它返回一个 jsonEncoded 的 Map 对象列表。
每个列表的大小可以(并且将会)改变,所以我不能有一个只检查和解码前几个或其他东西的函数。每个 Map 对象也可能包含不同的信息,所以我不能让它静态解析。我需要对整个列表进行 jsonDecode,并将其转换回单独的 Map 对象列表,以便我可以在程序的其余部分中使用 Map 对象中包含的信息。
出于隐私原因,我无法提供我收到的物品类型(或任何类似物品)的示例,对于给您带来的不便以及尝试回答问题的难度增加,我深表歉意。
也就是说,我知道我只需要一个函数来检查列表中有多少对象,将 response.body 拆分成这么多部分,将每个部分解码为 Map 对象,然后将其添加到列表中,或数组。
您可以提供的任何信息(即使不是特定代码)都会有所帮助,即使只是告诉我应该查看哪些命令。 (最好有一个他们的语法示例,但当然不是强制性的)。
如果您需要我能提供的任何信息,我很乐意提供。提前谢谢你。
【问题讨论】:
您检查过问题指南吗? ***.com/help/how-to-ask 如果你不能分享你的代码,那么用虚拟代码重现你的问题并在这里分享。如果不共享任何代码,您获得帮助的机会就会很低。 我不能共享代码,也不能创建虚拟代码,我知道这是一个问题。问题是(出于隐私原因,保密条款)我什至无法提供服务器响应的虚拟副本。但是,我正在寻找的响应不是特定的代码,而只是我应该寻找什么样的命令。我知道这是一个通用的问题,但我正在寻找一个通用的回答。不过感谢您的回复。 如果是这种情况,您的问题很可能会被否决并被删除。 我不明白为什么。如果我有一个非常具体的问题,并且也这样做了,我完全可以理解为什么会这样。这不是一个具体的问题,而是一个通用的问题,因为我正在寻找一个开始的地方。如果人们选择否决它,那是他们的选择,但没有正当理由,这确实符合社区准则。 【参考方案1】:您的问题的问题在于,我们甚至不知道您传入数据的一般结构。作为一个社区,我们不需要知道一个实际的例子。即使是伪造的数据也足够了。
话虽如此,我将尝试为您提供一些示例,说明您的传入数据可能是什么,以及您如何做您想做的事情。
传入的 JSON 对象
假设您的传入数据如下所示:
"data1":
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":
"subsubdata1":"subvalue1"
,
"data2":
"subdata1":"subvalue1",
"subdata2":"subvalue2",
"subdata3":3,
"subdata4":
"subsubdata1":"subvalue1"
在这种情况下,您可以使用 jsonDecode,并且仍然能够计算键并返回关联的对象列表,如下所示:
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;
结束
希望,即使您的问题很模糊,但至少其中一种场景是您可以使用的。如果可以的话,创建一些可以共享的“模拟数据”和/或“模拟代码”总是更好。该社区使用所有可用数据来构建他们的答案。您提供给我们的数据越多,您得到的答案就越好。
【讨论】:
感谢您花时间给我一个开始研究的地方,而不是替代方案。至少,有了你给我的东西,我现在应该能够在我的代码中走得更远,如果我确实有一个特定的问题,我将能够模拟它。再次感谢您。以上是关于Flutter json解码_TypeError(类型'List <dynamic>'不是'Map <dynamic,dynamic>'类型的子类型)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章