Apigee 中具有不同父名称的数组中的 JsonToXML 数组

JsonToXML Array within Array with Different Parent Names in Apigee

我正在尝试为 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>

它仍然可以正确处理学生,事实上,它将我的学生变成了老师。有人可以帮忙吗

要从 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 步骤。