Mule中如何将指定JSON结构转换为拆分后的Map集合?
JSON转多Map结构解决方案
输入JSON格式
{ "actos-evaluacion": [ { "subject": "<id-subject>", "name": "<name>", "marks": ["<student_id>:<mark>", "<student_id>:<mark>", "<student_id>:<mark>"] }, { "subject": "<id-subject>", "name": "<name>", "marks": ["<student_id>:<mark>", "<student_id>:<mark>"] } ] }
目标输出结构
每个学生对应一个独立的Map,最终形成一维列表:
[ { "id_subject": "<id-subject>", "name": "<name>", "student_id": "<student_id>", "mark": "<mark>" }, ... ]
实现方式(以DataWeave 2.x为例,适用于MuleSoft场景)
%dw 2.0 output application/json --- flatten(payload."actos-evaluacion" map (evalItem) -> evalItem.marks map (markStr) -> { id_subject: evalItem.subject, name: evalItem.name, student_id: (markStr splitBy ":")[0] trim, mark: (markStr splitBy ":")[1] trim as Number } )
逻辑说明
- 外层遍历
actos-evaluacion数组的每个科目项,保留当前项的subject和name上下文 - 内层遍历当前科目项的
marks数组,拆分每个student_id:mark格式的字符串 - 用
trim处理字符串中的冗余空格,as Number将分数转为数字类型(不需要可省略) flatten将嵌套数组展开为一维数组,得到每个学生对应一个Map的结果
其他语言实现示例(Java)
List<Map<String, Object>> resultList = new ArrayList<>(); // 假设已将原始JSON解析为JSONObject对象 JSONArray evalArray = jsonObj.getJSONArray("actos-evaluacion"); for (int i = 0; i < evalArray.length(); i++) { JSONObject evalItem = evalArray.getJSONObject(i); String subjectId = evalItem.getString("subject"); String subjectName = evalItem.getString("name"); JSONArray marksArray = evalItem.getJSONArray("marks"); for (int j = 0; j < marksArray.length(); j++) { String markEntry = marksArray.getString(j).trim(); String[] parts = markEntry.split(":"); Map<String, Object> studentMap = new HashMap<>(); studentMap.put("id_subject", subjectId); studentMap.put("name", subjectName); studentMap.put("student_id", parts[0].trim()); studentMap.put("mark", Integer.parseInt(parts[1].trim())); resultList.add(studentMap); } }
内容的提问来源于stack exchange,提问作者twoo
相关产品推荐
相关产品推荐

