【问题标题】:Unhandled Exception: InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>未处理的异常:InternalLinkedHashMap<String, dynamic>' 不是 'List<dynamic> 类型的子类型
【发布时间】:2019-08-21 03:21:59
【问题描述】:

我正在尝试从服务器获取 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!";
  }

未处理的异常:类型 '_InternalLinkedHashMap' 是 不是“列表”类型的子类型

可能是什么原因?

【问题讨论】:

    标签: json list flutter dart


    【解决方案1】:

    这里有两种可能出错的常见方式:

    1. 如果你的响应是一个 json 数组,比如

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

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

      我们是这样投的data = json.decode(response.body).cast&lt;ObjectName&gt;();

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

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

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

      那么json.decode 将返回一个Map,而不是一个List

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

    【讨论】:

    • 以及我们如何将 List 转换为 List
    • @Diyen Momjang,我的数组就像 datakey:[{key:value}, {key:value}, {key:value}] 我面临同样的问题,你能帮帮我吗出去?
    【解决方案2】:

    似乎此错误可能会根据各种开发人员错误弹出。
    就我而言,我使用的是 EasyLocalization 键,但没有在 asset/lang/en_US.json 文件下定义它。

    【讨论】:

      【解决方案3】:

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

      你需要使用:

      map['eventType'].cast&lt;String, dynamic&gt;()

      Map&lt;String, dynamic&gt;.from(map['eventType'])

      你也可以这样解决:

      Map<String, dynamic> myMap = Map<String, dynamic>.from(/*Your Source*/ );
      

      【讨论】:

        【解决方案4】:

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

        你应该序列化反序列化它回到Map&lt;String, dynamic&gt;

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

        【讨论】:

        【解决方案5】:

        你可以使用 new Map&lt;String, dynamic&gt;.from(snapshot.value);

        【讨论】:

        • 使用 response.body 而不是 snapshot.value
        • 他使用 sn-p 作为 firebasedatabase
        • 提供更多细节
        【解决方案6】:

        最简单的方法(一维):

        Map<String, dynamic> data = new Map<String, dynamic>.from(json.decode(response.body));
        
        print(data['name']);
        

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            这对我有用:

            1. 创建列表数据
            2. 使用 Map 解码 JSON 文件
            3. 使用 List 对象 Data 获取 JSON 文件的名称
            4. 在索引和列表对象的帮助下,我从 JSON 文件中动态打印了项目
            setState(){
            
                Map<String, dynamic> map = json.decode(response.body);
                Data  = map["name"];
            }
            
            // for printing
            Data[index]['name1'].toString(),
            

            【讨论】:

            • 这对我有用..1)创建一个列表数据,2)使用 Map 解码 json 文件,3)使用 List 对象数据来获取 json 文件的名称。4)使用在索引和列表对象的帮助下,我从 json 文件中动态打印了项目。
            【解决方案9】:

            如果您使用 retrofit.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
            

            【讨论】:

              【解决方案10】:

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

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

              【讨论】:

                【解决方案11】:

                我在使用 json_annotationjson_serializablebuild_runner 时遇到了同样的错误。当为具有类属性的类调用 ClassName.fromJson() 方法时会发生这种情况(例如:类 User 具有属性类 Address)。

                作为解决方案,我修改了每个类的生成的*.g.dart 文件,将Map&lt;String, dynamic&gt;) 更改为Map&lt;dynamic, dynamic&gt;) 在方法_$*FromJson 内部存在深度转换的任何地方

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

                【讨论】:

                  【解决方案12】:

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

                  一种方法是使用List.from

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2022-10-05
                    • 2019-09-26
                    • 2021-05-21
                    • 1970-01-01
                    • 2020-11-05
                    • 2021-05-05
                    • 1970-01-01
                    相关资源
                    最近更新 更多