我正在尝试为WSDL调用构建XML结构,因为没有使用参数传递方法发送复杂对象的任意大小列表的真正正确方法,我决定将Json用于XML。这是我的基本Json
school:{
teachers : [
{students :[{name: student1}, {name: student2}], name : teacher1},
{students :[{name: student3}, {name: student4}], name : teacher2}
]
}
我希望看到的最终结果是
<school>
<teachers>
<name>teacher1</name>
<students>
<name>student1</name>
<name>student2</name>
</students>
</teachers>
<teachers>
<name>teacher1</name>
<students>
<name>student1</name>
<name>student2</name>
</students>
</teachers>
</school>
使用Apigee文档
<ArrayRootElementName>Teachers</ArrayRootElementName>
它仍然会妥善处理学生,事实上它会改变我的学生对教师。有人可以帮忙吗。
答案 0 :(得分:1)
要从JSONToXML策略中获取所需的XML,必须以不同方式对输入JSON进行整形。 JSONToXML的输入应如下所示:
{
"school": {
"teachers": [
{
"students": {
"name": [
"student1",
"student2"
]
},
"name": "teacher1"
},
{
"students": {
"name": [
"student3",
"student4"
]
},
"name": "teacher2"
}
]
}
}
但你的输入不是那样的。你怎么看起来那样?
您可以使用Javascript转换来完成此操作。使用Javascript将原始JSON重新映射到所需的JSON。这是一个例子:
var c = context.getVariable('response.content') + '',
body = JSON.parse(c);
if (body.school) {
if (body.school.teachers) {
body.school.teachers.forEach(function(item){
if (item.students) {
item.students = fixupStudents(item.students);
}
});
//body.school.teachers = fixupTeachers(body.school.teachers);
}
}
函数fixupStudents看起来像这样:
function fixupArray(obj, propName, accessor) {
var type = Object.prototype.toString.call(obj), i,
a = [], rval = {};
if (null !== obj) {
if (type === "[object Array]") {
for (i=0; i<obj.length; i++) {
a.push(accessor(obj[i])); // string
}
rval[propName] = a;
}
}
return rval;
}
function fixupStudents(obj) {
return fixupArray(obj, 'name', function(o){return o.name;});
}
这是a gist that will do the trick。
您必须在JSONToXML步骤之前运行此JS步骤。