未处理的异常: InternalLinkedHashMap < String,Dynamic >’不是类型‘ List < Dynamic > 的子类型

我尝试从服务器获取 JSON 响应并将其输出到控制台。

Future<String> login() async {
var response = await http.get(
Uri.encodeFull("https://etrans.herokuapp.com/test/2"),
headers: {"Accept": "application/json"});


this.setState(() {
data = json.decode(response.body);
});




print(data[0].name);
return "Success!";
}

未处理的异常: type’_ InternalLinkedHashMap < String,Dynamic >’为 不是“ List”类型的子类型

原因是什么?

265522 次浏览

您必须将 dataruntimeType_InternalLinkedHashMap转换为实际的 List

一种方法是使用 List.from

final _data = List<dynamic>.from(
data.map<dynamic>(
(dynamic item) => item,
),
);

这里有两个常见的错误:

  1. 如果您的响应是 json 数组,如

    [
    {
    key1: value1,
    key2: value2,
    key3: value3,
    },
    {
    key1: value1,
    key2: value2,
    key3: value3,
    },
    
    
    .....
    ]
    

    然后,我们使用 data[0]["name"],而不是 < strong > data[0].name 除非强制转换为具有 name 属性的对象,否则不能使用 < strong > data[0].name

    我们就像这样铸造 data = json.decode(response.body).cast<ObjectName>();

    ObjectName可以是任何你想要的对象(内建或自定义)。但是要确保它有 name 属性

  2. 如果您的响应是一个 JSON 对象,比如

    {
    dataKey: [
    {
    key1: value1,
    key2: value2,
    key3: value3,
    }
    ]
    }
    

    然后 json.decode将返回一个 地图,而不是 名单

    Map<String, dynamic> map = json.decode(response.body);
    List<dynamic> data = map["dataKey"];
    print(data[0]["name"]);
    

我在使用 json_annotationjson_serializablebuild_runner时出现了同样的错误。它发生在为具有类属性的类调用 ClassName.fromJson()方法时(例如: 类 User 具有属性类 Address)。

作为一个解决方案,我修改了每个类生成的 *.g.dart文件,通过在方法 _$*FromJson中有深度转换的地方将 Map<String, dynamic>)改为 Map<dynamic, dynamic>)

唯一的问题是,每次重新生成文件时都必须再次更改它。

如果您需要使用通用字段,有一个解决方案:

class DicData
{
int tot;
List<Map<String, dynamic>> fields;


DicData({
this.tot,
this.fields
});


factory DicData.fromJson(Map<String, dynamic> parsedJson) {
return DicData(
tot: parsedJson['tot'],
//The magic....
fields : parsedJson["fields"] = (parsedJson['fields'] as List)
?.map((e) => e == null ? null : Map<String, dynamic>.from(e))
?.toList()
);
}


}

你可以用 new Map<String, dynamic>.from(snapshot.value);

如果使用 改装 Dart并为带注释的方法声明了错误的返回类型,您可能会得到这个错误:

@GET("/search")
Future<List<SearchResults>> getResults();
// wrong! search results contains a List but the actual type returned by that endpoint is SearchResults

@GET("/search")
Future<SearchResults> getResults();
// correct for this endpoint - SearchResults is a composite with field for the list of the actual results

这对我很有效:

  1. 创建列表数据
  2. 使用 Map 解码 JSON 文件
  3. 使用 List 对象 Data 获取 JSON 文件的名称
  4. 在 index 和 list 对象的帮助下,我已经从 JSON 文件中动态打印了这些条目
setState(){


Map<String, dynamic> map = json.decode(response.body);
Data  = map["name"];
}


// for printing
Data[index]['name1'].toString(),

如果您使用 FirebaseCloud,请确保您没有尝试使用相同的 DocumentID 添加多个数据;

firestore.collection('user').document(UNIQUEID).setData(educandos[0].toJson()).

最简单的方法(一维) :

Map<String, dynamic> data = new Map<String, dynamic>.from(json.decode(response.body));


print(data['name']);

您正在尝试案件的 InternalLinkedHashMap实例,这是不可能的。

你应该 连载反序列化它回到 Map<String, dynamic>

InternalLinkedHashMap<String, dynamic> invalidMap;


final validMap =
json.decode(json.encode(invalidMap)) as Map<String, dynamic>;

似乎这个错误可能会根据不同的开发人员错误而出现。
在我的例子中,我使用了一个 EasyLocalization键,但是没有在 asset/lang/en_US.json文件下定义它。