Dart:尽管强制转换,但无法将 List<dynamic> 转换为 List<Map<String, dynamic>>
Posted
技术标签:
【中文标题】Dart:尽管强制转换,但无法将 List<dynamic> 转换为 List<Map<String, dynamic>>【英文标题】:Dart: cannot convert List<dynamic> to List<Map<String, dynamic>> despite cast 【发布时间】:2020-06-02 18:21:55 【问题描述】:我正在尝试从 Dart/Flutter 应用程序中的 Rest API 解析数据。 JSON 在根中包含一个名为data
的字段,其中包含Word
s 的列表。我想从这个 JSON 中得到一个List<Word>
。我已经有以下代码:
Map<String, dynamic> jsonMap = json.decode(jsonString);
List<Word> temp = jsonMap['data']
.map((map) => map as Map<String, dynamic>)
.map((Map<String, dynamic> map) => Word.fromJson(map)).toList(); // map to List<Word>
Word.fromJson
具有以下签名:
Word.fromJson(Map<String, dynamic> json)
对map
的最终调用给出以下错误:
type 'List<dynamic>' is not a subtype of type 'List<Map<String, dynamic>>'
据我了解,对map((map) => map as Map<String, dynamic>)
的调用应该将List<dynamic>
转换为List<Map<String, dynamic>>
,所以我对为什么会收到错误感到困惑。
任何建议表示赞赏。
【问题讨论】:
请在 jsonString 中添加你得到的内容并添加 Word 类。 【参考方案1】:如果data
是单词列表,您可以“转换”为通用列表并迭代每个项目以转换为新的Word
对象,
List<Word> temp = (jsonMap['data'] as List).map((itemWord) => Word.fromJson(itemWord)).toList();
key是String,data是Dynamic,如果jsonMap['data']
是jsonString上的List,则不是Map<String,dynamic>
,不能直接转换成map。
jsonString 示例并转换:
final jsonString = '''
"field": "titulo",
"data": ["teste":1,"teste":2,"teste":3,"teste":4]
''';
final jsonMap = json.decode(jsonString);
List<Word> temp = (jsonMap['data'] as List)
.map((itemWord) => Word.fromJson(itemWord))
.toList();
单词类
class Word
int teste;
Word(this.teste);
Word.fromJson(Map<String, dynamic> json)
teste = json['teste'];
Map<String, dynamic> toJson()
final Map<String, dynamic> data = new Map<String, dynamic>();
data['teste'] = this.teste;
return data;
使用 JSON 到 Dart 生成的类 https://javiercbk.github.io/json_to_dart/
【讨论】:
【参考方案2】:如果您想将List<dynamic>
转换为List<Map<String, dynamic>>
,如标题所示,您应该转换2 次:
(jsonDecode(response.body)["data"] as List).map((e) => e as Map<String, dynamic>)?.toList();
【讨论】:
【参考方案3】:如果您使用强模式,我必须明确定义字段类型?也没有必要。
注意“动态 e”
(jsonDecode(response.body)["data"] as List).map((dynamic e) => e as Map<String, dynamic>).toList();
【讨论】:
type '_InternalLinkedHashMap以上是关于Dart:尽管强制转换,但无法将 List<dynamic> 转换为 List<Map<String, dynamic>>的主要内容,如果未能解决你的问题,请参考以下文章
在 Dart 和 JavaScript 之间传递对象列表 — 将 List<dynamic> 转换为 List<GeocodeResult>
如何解决 - 无法使用Automapper将Generic.List强制转换为Linq.IQueryable?
无法将NHibernate.Collection.Generic.PersistentGenericBag类型的对象强制转换为List
如何将 List<Map<String,dynamic> 转换为 Dart 中的单个变量?
无法将类型为“System.Collections.Generic.List`1[EPMS.Domain.SingleItem]”的对象强制转换为类型“EPMS