【问题标题】:Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'HashMap<String, dynamic>' Dart未处理的异常:类型 '_InternalLinkedHashMap<String, dynamic>' 不是类型 'HashMap<String, dynamic>' Dart 的子类型
【发布时间】:2022-01-14 08:59:10
【问题描述】:

下面有回复

[
    {
        "name": "Kamchatka",
        "about": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Maxime mollitia,molestiae quas vel sint commodi repudiandae consequuntur voluptatum laborumnumquam blanditiis harum quisquam eius sed odit fugiat iusto fuga praesentium optio, eaque rerum! Provident similique accusantium nemo autem.",
        "email": "kamchatka@mail.com",
        "index": 1,
        "picture": "https://thispersondoesnotexist.com/"
    },
    {
        "name": "Valjakutse",
        "about": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Maxime mollitia,molestiae quas vel sint commodi repudiandae consequuntur voluptatum laborumnumquam blanditiis harum quisquam eius sed odit fugiat iusto fuga praesentium optio, eaque rerum! Provident similique accusantium nemo autem.",
        "email": "valjakutse@mail.com",
        "index": 2,
        "picture": "https://thispersondoesnotexist.com/"
    },
    {
        "name": "Shipment",
        "about": "Lorem ipsum dolor sit amet consectetur adipisicing elit. Maxime mollitia,molestiae quas vel sint commodi repudiandae consequuntur voluptatum laborumnumquam blanditiis harum quisquam eius sed odit fugiat iusto fuga praesentium optio, eaque rerum! Provident similique accusantium nemo autem.",
        "email": "shipment@mail.com",
        "index": 3,
        "picture": "https://thispersondoesnotexist.com/"
    }
]

我有一个异步的 Future,应该接受响应并将其转换为如下所示的 HashMap 列表


  Future<List<HashMap<String, dynamic>>> _fetchUsersListHashMap() async {
    try {
      final response = await http.get(Uri.parse("https://jsonkeeper.com/b/XBCA"));

      late List<HashMap<String, dynamic>> responseList;

      responseList = List<HashMap<String, dynamic>>.from(json.decode(response.body));
    
      String stringList = jsonEncode(responseList);

      log("FetchUsersListHashMap $stringList");

      return responseList;

    } catch (e) {

      log("FetchUsersListHashMapException $e");

      rethrow;
    }
  }

当我调用 _fetchUsersListHashMap 时出现以下错误


Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'HashMap<String, dynamic>'

我什至尝试改变分配 responseList 的方式

responseList = json.decode(response.body);

但它没有为 HashMap 列表分配来自 url 的响应

以下是我在 java 中是如何做到的,只是我无法在颤振中复制相同的概念

  List<HashMap<String, Object>> responseList = new Gson().fromJson(response,
                                new TypeToken<List<HashMap<String, Object>>>() {
                                }.getType());

【问题讨论】:

  • 只使用Map 而不是写HashMapLinkedHashMapHashMap 不一样,但最后你可能并不关心 Map 的内部实现,所以只使用接口而不是更具体的类。
  • 我不使用 Map 有一个非常具体的原因,因为响应可能包含具有空值的键并且 Map 不会接受这一点,我已经能够在 hava 中使用 gson 并键入 token 但 gson目前没有零安全性。 @ julemand101 下面是我在jave 中的操作方法,我只想要一个可以在flutter List> responseList = new Gson().fromJson(response, new TypeToken>>() { }.getType());

标签: json list flutter dart hashmap


【解决方案1】:
Future<List<HashMap<String, dynamic>>> _fetchUsersListHashMap() async {
 try {
  final response = await http.get(Uri.parse("https://jsonkeeper.com/b/XBCA"));

  final decoded = json.decode(response.body);

  final responseList = decoded
    .map<HashMap<String, dynamic>>((e) => HashMap<String, dynamic>.from(e))
    .toList();

  String stringList = jsonEncode(responseList);

  log("FetchUsersListHashMap $stringList");

  return responseList;
} catch (e) {
  log("FetchUsersListHashMapException $e");

  rethrow;
 }
}

【讨论】:

    【解决方案2】:

    试试这个:

      List<HashMap<String, dynamic>> responseList = [];
      List jsonList = List.from(jsonDecode(response.body));
      jsonList.forEach((element) {
        responseList.add(HashMap.from(Map.from(element)));
      });
    

    【讨论】:

    • 如何打印 responseList 以查看其内容
    • print(responseList) 应该可以工作。
    猜你喜欢
    • 2021-02-11
    • 2021-09-20
    • 2019-08-07
    • 2020-08-20
    • 2021-07-11
    • 2021-09-13
    • 2022-11-30
    • 2020-07-14
    相关资源
    最近更新 更多