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

Flutter&Dart:如何将Json解析结果转为不含_JsonMap的Map<String,dynamic>

JSON解码后_JsonMap类型转换问题

我编写了如下代码:

RxMap<String, String> menuDrink = RxMap<String, String>({}), menuFood = RxMap<String, String>({});

Map<String, dynamic> result = {
  'balance': 100,
  'menu': {
    'drink': {
      '1': 'menu 1',
      '2': 'menu 2',
      '3': 'menu 3',
    },
    'food': {
      '1': 'menu 1',
      '2': 'menu 2',
      '3': 'menu 3',
    }
  }
};

menuDrink.value = result['menu']['drink'];
menuFood.value = result['menu']['food'];

这段代码运行正常,但当我通过Map<String, dynamic> result = json.decode(response);获取result时,会报错:

Error: Expected a value of type 'Map<String, String>', but got one of type '_JsonMap'

我尝试了Map result = json.decode(response) as Map<String, dynamic>;,但类型仍为_JsonMap;使用Map result = Map<String,dynamic>.from(json.decode(response));得到的是LinkedMap<dynamic, dynamic>;通过循环创建新Map后,外层不再是_JsonMap,但内部的Map值仍为_JsonMap。

请问如何将结果转换为完全不含_JsonMap的Map<String, dynamic>?目前我仅能单独将result['menu'][...]转换为Map<String,String>。


解决方案

要彻底转换所有层级的_JsonMap为标准Map,需要递归遍历并处理嵌套结构,因为Map.from()仅处理外层,内部嵌套的_JsonMap不会被转换。

通用递归转换方案

编写一个递归函数处理任意层级的嵌套Map:

Map<String, dynamic> convertToStandardMap(Map<dynamic, dynamic> jsonMap) {
  final standardMap = <String, dynamic>{};
  for (final entry in jsonMap.entries) {
    final key = entry.key.toString();
    final value = entry.value;
    if (value is Map<dynamic, dynamic>) {
      // 递归处理嵌套的Map
      standardMap[key] = convertToStandardMap(value);
    } else {
      standardMap[key] = value;
    }
  }
  return standardMap;
}

使用示例:

final decodedData = json.decode(response);
if (decodedData is Map<dynamic, dynamic>) {
  final Map<String, dynamic> result = convertToStandardMap(decodedData);
  // 此时所有层级的Map都是标准类型
  menuDrink.value = result['menu']['drink'] as Map<String, String>;
  menuFood.value = result['menu']['food'] as Map<String, String>;
}

针对固定层级的手动转换(如果嵌套层级明确)

如果你的JSON结构固定只有两层嵌套(如menu下的drink/food),可以直接手动转换内层:

final Map<String, dynamic> result = Map<String, dynamic>.from(json.decode(response));
// 手动转换内层的drink和food为标准Map
result['menu']['drink'] = Map<String, String>.from(result['menu']['drink']);
result['menu']['food'] = Map<String, String>.from(result['menu']['food']);

递归方案更灵活,适合结构复杂或层级不确定的JSON数据。

内容的提问来源于stack exchange,提问作者Sittiphan Sittisak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:10:35