Flutter中JSON解析后List<dynamic>转List<String>运行报错求助
Dart中JSON解析List转List的解决方案
问题根源
jsonDecode解析JSON后,所有集合类型默认都是List<dynamic>或Map<String, dynamic>——哪怕JSON里的列表全是字符串,Dart也不会自动推断为List<String>,直接赋值或强制转换会触发类型不匹配的运行时错误。
有效解决方法
方法1:使用List.from()构造函数
直接通过List.from()将List<dynamic>转换为List<String>,该方法会自动处理类型转换(前提是列表元素本身都是字符串):
List<String> channels = List<String>.from(map['names']);
方法2:先转List再用cast<String>()
cast<String>() 先明确将map['names']转为List<dynamic>,再通过cast<String>()强制转换元素类型:
List<String> channels = (map['names'] as List<dynamic>).cast<String>();
方法3:指定泛型的map转换
之前使用map的方法无效,是因为未指定泛型导致返回Iterable<dynamic>,补充泛型后即可生成List<String>:
List<String> channels = map['names'].map<String>((val) => val.toString()).toList();
原方案无效的原因
- 直接
as List<String>:Dart的泛型不支持协变,List<dynamic>无法直接强制转为List<String>,运行时必然报错。 - 无泛型的map调用:
map((val) => val.toString())返回Iterable<dynamic>,toList()后仍是List<dynamic>,无法赋值给List<String>。 List channels4 = map['names'] as List<String>:声明的变量是List<dynamic>,但强制转换为List<String>本身逻辑矛盾,运行时触发错误。
内容的提问来源于stack exchange,提问作者Gilded Json
相关产品推荐
相关产品推荐

