首页 > 解决方案 > 使用字符串键和列表将 JSON 转换为映射价值观

问题描述

我正在尝试转换具有键的字符串和值的字符串数组的 JSON。

据我了解,这应该有效:

import 'dart:convert';

void main() {
  var jsonString = '{"key": ["1", "2", "3"]}';
  var data = json.decode(jsonString) as Map;
  var result = data.cast<String, List<String>>();
  print(result);
}

但是我得到的错误是type 'List<dynamic>' is not a subtype of type 'List<String>' in type cast.

然而,有趣的是,以下内容确实可以正常工作:

import 'dart:convert';

void main() {
  var jsonString = '{"key": "value"}';
  var data = json.decode(jsonString) as Map;
  var result = data.cast<String, String>();
  print(result);
}

所以,我假设.cast<>Dart 2 引入的方法不知道如何转换不是简单类型的嵌套类型,如String,intbool.

我如何在Map<String, List<String>>不求助于外部库的情况下将此对象转换为 a ?

标签: dart

解决方案


因此,我假设.cast<>Dart 2 引入的方法不知道如何转换不是简单类型(如 String、int 或 bool)的嵌套类型。

That's correct. It just does a one-level-deep shallow conversion. You can do the nested conversion yourself like:

void main() {
  var jsonString = '{"key": ["1", "2", "3"]}';
  var data = json.decode(jsonString) as Map;

  var result = data.map((key, value) =>
      MapEntry<String, List<String>>(key, List<String>.from(value)));
  print(result.runtimeType);
}

This is calling Map.map(). Sometimes Map.fromIterable() or Map.fromIterables() is a better fit. The collection types have a handful of methods like this to convert between different types.


推荐阅读