如何通过动态字段列表访问JSON节点?解决类型转换报错
动态字段列表访问JSON节点的正确实现方式
原始JSON数据
{ "data": { "splashPage": { "title": "Splash" }, "homePage": { "title": "Home" } } }
错误代码及问题
尝试通过字符串拼接生成访问路径并强转类型的代码如下:
List<String> accessField = ['data','splashPage']; final out = accessField.map((e) => "['$e']").join(); Map jsonMapData = jsonDecode(jsonData); Map<String, dynamic> splashPageJson = '${jsonMapData}$out' as Map<String, dynamic>; print(splashPageJson);
运行后抛出类型转换错误:
_CastError (type 'String' is not a subtype of type 'Map<String, dynamic>' in type cast)
错误核心:将Map与字符串路径拼接后得到的是字符串类型,无法直接强转为Map对象,这种实现思路本身不成立。
正确实现方式
通过逐层遍历字段列表的方式,依次从当前节点中取出对应键的值,代码示例:
import 'dart:convert'; void main() { String jsonData = ''' { "data": { "splashPage": { "title": "Splash" }, "homePage": { "title": "Home" } } } '''; // 动态字段列表,目标为splashPage节点 List<String> accessField = ['data','splashPage']; Map<String, dynamic> jsonMapData = jsonDecode(jsonData); dynamic currentNode = jsonMapData; for (String field in accessField) { // 校验当前节点是否为Map且包含目标字段,避免异常 if (currentNode is Map<String, dynamic> && currentNode.containsKey(field)) { currentNode = currentNode[field]; } else { // 处理字段不存在或节点类型错误的情况 currentNode = null; break; } } // 输出最终结果 if (currentNode is Map<String, dynamic>) { print(currentNode); // 输出: {title: Splash} } else { print('指定节点不存在或类型错误'); } }
扩展说明
- 若需要访问
homePage节点,只需修改accessField为['data','homePage'],代码会自动逐层遍历获取目标节点。 - 代码中加入了类型校验和异常分支,避免因字段不存在或中间节点类型不匹配导致的程序崩溃。
内容的提问来源于stack exchange,提问作者SK-
相关产品推荐
相关产品推荐

