2016-09-15 2 views
-1

Привет, я новичок в ответе REST и JSON. Раньше я работал над SOAP. Я пытаюсь преобразовать тело массива JSON в XML. Мог ли кто-нибудь, пожалуйста, направить меня с помощью кода, который будет использоваться в Groovy? Я видел несколько ответов, но я не могу точно их модифицировать для тела JSON, которое у меня есть. Любая помощь будет высоко ценится. Благодаря!Преобразование массива JSON в XML - Groovy

Пример JSON:

[ 
     { 
     "field": "GULP", 
     "baseDT":  { 
     "name": "HaveAGulp", 
     "descriptionTx": "Gulp the water", 
     "flow":   { 
      "beginDate": "2016-08-31", 
      "endDate": "9999-12-31" 
     }, 
     "check":   { 
      "createUserId": "GULPUSER", 
      "createTs": "2016-08-30 11:08:56.985204", 
      "lastModifiedUser": "GULPUSER", 
      "lastModifiedTs": "2016-08-30 11:08:56.985204" 
     } 
     } 
    }, 
     { 
     "field": "HELP", 
     "baseDT":  { 
     "name": "HelpSomeone", 
     "descriptionTx": "Help Help Help", 
     "flow":   { 
      "beginDate": "2016-08-31", 
      "endDate": "9999-12-31" 
     }, 
     "check":   { 
      "createUserId": "HELPUSER", 
      "createTs": "2016-08-30 11:08:56.985204", 
      "lastModifiedUser": "HELPUSER", 
      "lastModifiedTs": "2016-08-30 11:08:56.985204" 
     } 
     } 
    } 
] 

Ожидая XML: Поскольку нет имен узлов из JSON мы все еще хотим иметь сериализованную индекс для каждого набора в пределах массива JSON.

<jsonAsXML> 
    <0> 
     <field>GULP</field> 
     <baseDT> 
      <name>HaveAGulp</name> 
      <descriptionTx>Gulp the water</descriptionTx> 
      <flow> 
       <beginDate>2016-08-31</beginDate> 
       <endDate>9999-12-31</endDate> 
      </flow> 
      <check> 
       <createUserId>HELPUSER</createUserId> 
       <createTs>2016-08-30 11:08:56.985204</createTs> 
       <lastModifiedUser>HELPUSER</lastModifiedUser> 
       <lastModifiedTs>2016-08-30 11:08:56.985204</lastModifiedTs> 
     </baseDT> 
    </0> 
    <1>... 
    </1> 
</jsonAsXML> 
+0

http://stackoverflow.com/questions/29937254/convert-json-to-xml-using-groovy –

ответ

1

Вы можете попробовать использовать JsonSlurper, чтобы получить JSON пересечь его, и Markupbuilder, чтобы сохранить его как XML. Это всего лишь пример и не учитывает все возможности, поскольку я предполагаю, что в вашем примере показано, что ваш корень всегда находится в Array.

import groovy.json.* 
import groovy.xml.* 

def json = '''[ 
     { 
     "field": "GULP", 
     "baseDT":  { 
     "name": "HaveAGulp", 
     "descriptionTx": "Gulp the water", 
     "flow":   { 
      "beginDate": "2016-08-31", 
      "endDate": "9999-12-31" 
     }, 
     "check":   { 
      "createUserId": "GULPUSER", 
      "createTs": "2016-08-30 11:08:56.985204", 
      "lastModifiedUser": "GULPUSER", 
      "lastModifiedTs": "2016-08-30 11:08:56.985204" 
     } 
     } 
    } 
]''' 

// parse your json 
def slurper = new JsonSlurper().parseText(json) 

// recursive helper to traverse the structure 
def helper(map){ 
    return { 
     map.each{ k,v -> 
      println "$k $v" 
      if(v instanceof Map){ 
       "$k" helper(v) 
      }else if(v instanceof List){ 
       v.each{ element -> 
        "$k" helper(element) 
       } 
      }else{ 
       "$k"("$v") 
      } 
     } 
    } 
} 

StringWriter writer = new StringWriter() 
new MarkupBuilder(writer).jsonAsXml { 
    // for each element in the json array 
    slurper.eachWithIndex { content, index -> 
     "$index"(helper(content)) 
    } 
} 

println writer.toString() 

Этот код возвращает ваш JSON трансформируются в последующей XML:

<jsonAsXml> 
    <0> 
    <baseDT> 
     <check> 
     <createTs>2016-08-30 11:08:56.985204</createTs> 
     <createUserId>GULPUSER</createUserId> 
     <lastModifiedTs>2016-08-30 11:08:56.985204</lastModifiedTs> 
     <lastModifiedUser>GULPUSER</lastModifiedUser> 
     </check> 
     <descriptionTx>Gulp the water</descriptionTx> 
     <flow> 
     <beginDate>2016-08-31</beginDate> 
     <endDate>9999-12-31</endDate> 
     </flow> 
     <name>HaveAGulp</name> 
    </baseDT> 
    <field>GULP</field> 
    </0> 
</jsonAsXml> 

ПРИМЕЧАНИЕ: The XML обычно имеет XSD однако JSON является более «свободный» формат, поэтому в его атрибуте атрибута атрибута не обязательно из-за этого JsonSlurper возвращает groovy.json.internal.LazyMap, которого не волнует. Вот почему элементы XML не в том порядке, в котором вы ожидаете.

+0

Очень красивый @albciff. – Rao

+0

@Rao спасибо :)! – albciff

+0

@albciff Огромное спасибо за ваш ответ, действительно оцените его! Это работает для меня просто отлично. Я думаю, что порядок все еще в порядке, поскольку я буду сравнивать это с ответом на тестовом этапе запроса JDBC. Я, вероятно, закажу объекты в обоих XML-файлах и сравню их. – ssc

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