场景:需要将传入的XML消息转换为JSON,但要维护所有数据。输入:
<StudentsData>
<Student name="ABC" rollnumber="123">
<Subject name="Maths">
<Grade Sem="1st" marks="90" result="pass"/>
<Grade Sem="2nd" marks="45" result="fail"/>
</Subject>
<Subject name="English">
<Grade Sem="1st" marks="75" result="pass"/>
<Grade Sem="2nd" marks="87" result="pass"/>
</Subject>
<Subject name="Physics">
<Grade Sem="1st" marks="67" result="pass"/>
<Grade Sem="2nd" marks="78" result="pass"/>
</Subject>
</Student>
<Student name="DEF" rollnumber="456">
<Subject name="Maths">
<Grade Sem="1st" marks="56" result="pass"/>
<Grade Sem="2nd" marks="87" result="pass"/>
</Subject>
<Subject name="English">
<Grade Sem="1st" marks="98" result="pass"/>
<Grade Sem="2nd" marks="99" result="pass"/>
</Subject>
<Subject name="Physics">
<Grade Sem="1st" marks="90" result="pass"/>
<Grade Sem="2nd" marks="87" result="pass"/>
</Subject>
</Student>
</StudentsData>
方法:
%dw 2.0
output application/json duplicateKeyAsArray=true
---
payload.*StudentsData map ((Student, index) ->
{
Name : Student.Student.@name,
RollNumber : Student.Student.@rollnumber,
Subjects : Student.Student.*Subject map ((sub, index) ->{
subjectName : sub.@name,
semester : sub.Grade.@Sem,
marks: sub.Grade.@marks,
result: sub.Grade.@result
} )
} )
输出:
[
{
"Name": "ABC",
"RollNumber": "123",
"Subjects": [
{
"subjectName": "Maths",
"semester": "1st",
"marks": "90",
"result": "pass"
},
{
"subjectName": "English",
"semester": "1st",
"marks": "75",
"result": "pass"
},
{
"subjectName": "Physics",
"semester": "1st",
"marks": "67",
"result": "pass"
}
]
}
]
问题:
- 结果中只有学生ABC的数据可用,其余所有学生的数据丢失
- 在学生ABC中,成绩仅适用于第一学期
请帮助我理解转换中的错误。提前感谢
解决方案是:
%dw 2.0
output application/json
---
payload.StudentsData.*Student map ((student, index) -> {
Name : student.@name,
RollNumber : student.@rollnumber,
Subjects : student.*Subject map ((sub, index) -> {
Subject : sub.@name,
performance : sub.*Grade map ((item, index) -> {
semester : item.@Sem,
marks: item.@marks,
result: item.@result
} )
} )
})
输出:
[
{
"Name": "ABC",
"RollNumber": "123",
"Subjects": [
{
"Subject": "Maths",
"performance": [
{
"semester": "1st",
"marks": "90",
"result": "pass"
},
{
"semester": "2nd",
"marks": "45",
"result": "fail"
}
]
},
{
"Subject": "English",
"performance": [
{
"semester": "1st",
"marks": "75",
"result": "pass"
},
{
"semester": "2nd",
"marks": "87",
"result": "pass"
}
]
},
{
"Subject": "Physics",
"performance": [
{
"semester": "1st",
"marks": "67",
"result": "pass"
},
{
"semester": "2nd",
"marks": "78",
"result": "pass"
}
]
}
]
},
{
"Name": "DEF",
"RollNumber": "456",
"Subjects": [
{
"Subject": "Maths",
"performance": [
{
"semester": "1st",
"marks": "56",
"result": "pass"
},
{
"semester": "2nd",
"marks": "87",
"result": "pass"
}
]
},
{
"Subject": "English",
"performance": [
{
"semester": "1st",
"marks": "98",
"result": "pass"
},
{
"semester": "2nd",
"marks": "99",
"result": "pass"
}
]
},
{
"Subject": "Physics",
"performance": [
{
"semester": "1st",
"marks": "90",
"result": "pass"
},
{
"semester": "2nd",
"marks": "87",
"result": "pass"
}
]
}
]
}
]