You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过动态字段列表访问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-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:05:14