Dart:尽管强制转换,但仍无法将 List<dynamic> 转换为 List<Map<String, dynamic>>

cam*_*024 6 json types dart flutter

我正在尝试从 Dart/Flutter 应用程序中的 Rest API 解析数据。JSON 包含一个data在根处调用的字段,其中包含一个Words列表。我想List<Word>从这个 JSON 中得到一个。我已经有以下代码:

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>
Run Code Online (Sandbox Code Playgroud)

Word.fromJson 具有以下签名:

Word.fromJson(Map<String, dynamic> json)
Run Code Online (Sandbox Code Playgroud)

最后调用map给出了以下错误:

type 'List<dynamic>' is not a subtype of type 'List<Map<String, dynamic>>'
Run Code Online (Sandbox Code Playgroud)

根据我的理解,调用 tomap((map) => map as Map<String, dynamic>)应该将 the 转换List<dynamic>为 a List<Map<String, dynamic>>,所以我对为什么会收到错误感到困惑。

任何建议表示赞赏。

Ali*_*i80 15

如果你想将 a 转换List<dynamic>List<Map<String, dynamic>>正如标题所示,你应该强制转换 2 次:

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


Ren*_*cci 10

如果data是单词列表,则可以“转换”为通用列表并迭代每个项目以转换为新Word对象,

List<Word> temp = (jsonMap['data'] as List).map((itemWord) => Word.fromJson(itemWord)).toList();
Run Code Online (Sandbox Code Playgroud)

key是String,data是Dynamic,如果jsonMap['data']是jsonString上的List,就不是a 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();
Run Code Online (Sandbox Code Playgroud)

词类

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

使用JSON 生成Dart 类https://javiercbk.github.io/json_to_dart/


Bre*_*ton 8

如果您使用强模式,我必须显式定义字段类型 ? 也没有必要。

注意“动态 e”

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