2015-01-06 3 views
1

Я пытаюсь создать структуру XML для вызова WSDL, так как нет истинного правильного способа отправки строкового списка сложных объектов с использованием метода передачи параметров, Я решил использовать Json для XML. Вот мой основной JsonJsonToXML-массив в массиве с различными родительскими именами в Apigee

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> 

Он по-прежнему будет обрабатывать студентов должным образом, в факт меняет моих учеников на Учителей. Может кто-то помочь, пожалуйста.

ответ

1

Чтобы получить желаемый XML из политики JSONToXML, вы должны по-разному формировать входной 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.

Вы должны выполнить этот шаг JS ПЕРЕД шагом JSONToXML.

+0

Поняв, что вы сказали, я вернулся и исправил свой json, который собирается Apigee, и это работает правильно. спасибо – Churk

 Смежные вопросы

  • Нет связанных вопросов^_^