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 的字段,其中包含Words 的列表。我想从这个 JSON 中得到一个List&lt;Word&gt;。我已经有以下代码:

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) =&gt; map as Map&lt;String, dynamic&gt;) 的调用应该将List&lt;dynamic&gt; 转换为List&lt;Map&lt;String, dynamic&gt;&gt;,所以我对为什么会收到错误感到困惑。

任何建议表示赞赏。

【问题讨论】:

请在 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&lt;String,dynamic&gt;,不能直接转换成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&lt;dynamic&gt; 转换为List&lt;Map&lt;String, dynamic&gt;&gt;,如标题所示,您应该转换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' 不是类型转换中类型 'List' 的子类型

以上是关于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 中的单个变量?

无法将String强制转换为List

无法将类型为“System.Collections.Generic.List`1[EPMS.Domain.SingleItem]”的对象强制转换为类型“EPMS