如何基于Model数据动态构建层级化Map并转换为JSON格式?
解决方案:层级化分组Model列表为团队->项目->工程师结构
首先明确目标数据结构:外层是团队名为键的Map,每个团队对应的值是项目名为键的Map,项目名对应的值是该项目下的工程师列表,也就是Map<String, Map<String, List<String>>>。
代码实现(两种方式)
方式1:forEach遍历初始化层级
List<Model> models = [ Model('A', 'php', 'engineer1'), Model('A', 'flutter', 'engineer2'), Model('A', 'flutter', 'engineer3'), Model('B', 'java', 'engineer4'), ]; // 初始化目标结构 Map<String, Map<String, List<String>>> result = {}; for (var model in models) { // 1. 检查团队是否存在,不存在则初始化项目Map if (!result.containsKey(model.team)) { result[model.team] = {}; } // 2. 检查当前团队下的项目是否存在,不存在则初始化工程师列表 var projectMap = result[model.team]!; if (!projectMap.containsKey(model.projectName)) { projectMap[model.projectName] = []; } // 3. 将工程师添加到对应项目的列表中 projectMap[model.projectName]!.add(model.engineersName); } // 输出结果 print(result);
方式2:fold方法链式分组(更简洁)
var result = models.fold<Map<String, Map<String, List<String>>>>({}, (acc, model) { // 处理团队层级,不存在则初始化项目Map acc[model.team] ??= {}; // 处理项目层级,不存在则初始化工程师列表 acc[model.team]![model.projectName] ??= []; // 添加工程师到对应列表 acc[model.team]![model.projectName]!.add(model.engineersName); return acc; });
问题原因分析
你之前遇到的空指针异常,是因为错误定义了目标结构:Map<dynamic, List<Map<dynamic, dynamic>>>不符合需求——团队对应的不是项目Map的列表,而是以项目名为键的Map,访问未初始化的层级时自然会触发空指针。
示例输出结构
运行上述代码后,格式化后的JSON输出如下:
{ "A": { "php": ["engineer1"], "flutter": ["engineer2", "engineer3"] }, "B": { "java": ["engineer4"] } }
内容的提问来源于stack exchange,提问作者user19834704
相关产品推荐
相关产品推荐

