Flutter解析JSON遇_InternalLinkedHashMap类型转换错误求解决
Flutter JSON解析:提取数组中所有userName的列表
示例JSON
{ "statusCode": 200, "message": "", "result": [ { "userName": "RAJ", "hierarchyLevel": 3, "sequence": 1, "isSuccess": 1 }, { "userName": "SAM", "hierarchyLevel": 3, "sequence": 1, "isSuccess": 1 } ] }
原代码
int jsonStatus = response.statusCode; if (jsonStatus == 200) { var jsonData = json.decode(response.body); if (jsonData["statusCode"] == 200) { List<dynamic> listValJson = jsonData["result"]; List<String> userList = new List<String>.from(listValJson); } }
报错信息
Error: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'String'
问题原因与解决方案
错误原因
listValJson中的每一项是_InternalLinkedHashMap<String, dynamic>类型(对应JSON里的对象),而List<String>.from(listValJson)试图直接把这些Map转换成String,导致类型不匹配报错。
正确写法
遍历listValJson,逐个取出每个对象里的userName字段,再收集成字符串列表:
int jsonStatus = response.statusCode; if (jsonStatus == 200) { var jsonData = json.decode(response.body); if (jsonData["statusCode"] == 200) { List<dynamic> listValJson = jsonData["result"]; // 提取所有userName并转为String列表 List<String> userList = listValJson .map((item) => item["userName"] as String) .toList(); } }
进阶优化(可选)
如果JSON结构复杂或需要频繁解析,建议创建实体类配合json_serializable包实现类型安全的解析:
- 添加依赖到
pubspec.yaml:
dependencies: json_annotation: ^4.8.1 dev_dependencies: build_runner: ^2.4.4 json_serializable: ^6.7.0
- 创建User实体类:
import 'package:json_annotation/json_annotation.dart'; part 'user.g.dart'; @JsonSerializable() class User { final String userName; final int hierarchyLevel; final int sequence; final int isSuccess; User({ required this.userName, required this.hierarchyLevel, required this.sequence, required this.isSuccess, }); factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); Map<String, dynamic> toJson() => _$UserToJson(this); }
- 运行命令生成序列化代码:
flutter pub run build_runner build
- 解析JSON:
int jsonStatus = response.statusCode; if (jsonStatus == 200) { var jsonData = json.decode(response.body); if (jsonData["statusCode"] == 200) { List<dynamic> listValJson = jsonData["result"]; List<User> users = listValJson.map((item) => User.fromJson(item)).toList(); List<String> userList = users.map((user) => user.userName).toList(); } }
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

