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
相关产品推荐
相关产品推荐

