Dart:尽管进行了类型转换,但无法将List<dynamic>转换为List<Map<String, dynamic>>。

19

我正在尝试在Dart/Flutter应用程序中解析来自Rest API的数据。JSON文件在根目录下包含一个名为data的字段,其中包含Word列表。我想从这个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类。 - Viren V Varasadiya
3个回答

26
如果 data 是一个单词列表,你可以将其“强制转换”为通用列表,并迭代每个项目以转换为新的 Word 对象。
List<Word> temp = (jsonMap['data'] as List).map((itemWord) => Word.fromJson(itemWord)).toList();

关键字是String,数据是Dynamic类型。如果jsonMap['data']在json字符串中是一个List类型,那么它不是Map<String,dynamic>类型,不能直接转换成map。

json字符串和转换的示例:

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 to Dart 生成的类 https://javiercbk.github.io/json_to_dart/


15

如果您想将 List<dynamic> 转换为如标题所示的 List<Map<String, dynamic>>,则应进行两次强制转换:

(jsonDecode(response.body)["data"] as List).map((e) => e as Map<String, dynamic>)?.toList();

1
这个真是太棒了,谢谢 @Ali80!! - undefined

8

如果您正在使用强模式,我需要明确定义字段类型,问号也不是必需的。

注意 'dynamic e'

(jsonDecode(response.body)["data"] as List).map((dynamic e) => e as Map<String, dynamic>).toList();

1
类型'_InternalLinkedHashMap<String,dynamic>'在类型转换中不是'type List<dynamic>'的子类型 - Néstor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接