未处理的异常:InternalLinkedHashMap<String, dynamic>' 不是类型 'List<dynamic> 的子类型

har*_*B10 72 dart flutter

我正在尝试从服务器获取 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!";
  }
Run Code Online (Sandbox Code Playgroud)

未处理的异常:类型“_InternalLinkedHashMap<String, dynamic>”不是“List”类型的子类型

可能是什么原因?

Diy*_*ang 90

以下是可能出错的两种常见方式:

  1. 如果您的响应是一个 json 对象,例如

    [
        {
          key1: value1,
          key2: value2,
          key3: value3,
        },
        {
          key1: value1,
          key2: value2,
          key3: value3,
        },
    
        .....
    ] 
    
    Run Code Online (Sandbox Code Playgroud)

    然后,我们使用data[0]["name"], notdata[0].name 除非我们转换为具有 name 属性的对象,否则我们不能使用data[0].name

    我们这样投 data = json.decode(response.body).cast<ObjectName>();

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

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

    {
        dataKey: [
          {
            key1: value1,
            key2: value2,
            key3: value3,
          } 
        ] 
    }
    
    Run Code Online (Sandbox Code Playgroud)

    然后json.decode将返回一个Map,而不是一个List

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


AKA*_*ANI 48

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

  • 使用response.body代替snapshot.value (4认同)
  • 他使用 firebaseddatabase 的片段 (2认同)

erl*_*man 19

您正在尝试处理一个InternalLinkedHashMap不可能的实例。

您应该将其序列化反序列化Map<String, dynamic>.

InternalLinkedHashMap<String, dynamic> invalidMap;

final validMap =
        json.decode(json.encode(invalidMap)) as Map<String, dynamic>;
Run Code Online (Sandbox Code Playgroud)


Par*_*iya 15

由于不会改变类型,它只是一个断言。

您需要使用:

map['eventType'].cast<String, dynamic>() 或者

Map<String, dynamic>.from(map['eventType'])

也可以这样解决:

Map<String, dynamic> myMap = Map<String, dynamic>.from(/*Your Source*/ );
Run Code Online (Sandbox Code Playgroud)


小智 7

最简单的方法(一维):

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

print(data['name']);
Run Code Online (Sandbox Code Playgroud)


jog*_*oms 5

您必须将runtimeTypeof datafrom_InternalLinkedHashMap转换为实际List.

一种方法是使用List.from.

final _data = List<dynamic>.from(
  data.map<dynamic>(
    (dynamic item) => item,
  ),
);
Run Code Online (Sandbox Code Playgroud)


Luc*_*son 5

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

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()
    );
  }

}
Run Code Online (Sandbox Code Playgroud)