Конвертер json xml с массивом в строке json

Мне нужно преобразовать json в xml, а затем преобразовать этот json обратно в xml, но я теряю объект массива json во время этого преобразования - я использую org.json lib.

Json-строка —

{
    "readResult": {
        "errors": [{
            "code": 400
        }]
    }
}

Кодовая база — с использованием org.json lib

String xml = XML.toString(new JSONObject("inputjsonstring"));
String json = XML.toJSONObject(xml).toString();

Вывод xml и json -

XML - <readResult><errors><code>400</code></errors></readResult>
JSON - 
{
        "readResult": {
            "errors": {
                "code": 400
            }
        }
}

Здесь этот json не имеет никакого массива, как это было в исходном json. Пожалуйста, предложите альтернативную библиотеку, чтобы сделать то же самое.


person vashishth    schedule 20.03.2017    source источник
comment
Вы сделали опечатку? Вы записываете json обратно в xml, но, вероятно, это должен быть xml обратно в json, верно?   -  person mevdschee    schedule 25.03.2017
comment
Может быть, эта проблема может помочь вам? stackoverflow.com/questions/13271369/convert-json-to-xml   -  person mevdschee    schedule 25.03.2017
comment
Библиотека Underscore-java может конвертировать json в xml и наоборот. Поддерживается массив с одним элементом.   -  person Valentyn Kolesnikov    schedule 08.02.2019


Ответы (4)


Спецификация Json говорит, что json может иметь такие типы данных, как строка, число, логическое значение, массив, объект и ноль.

одноэлементный массив в json - это особый случай, который вызывает проблемы с некоторыми API, такими как org.json. Поскольку эти библиотеки обрабатывают одноэлементный массив как обычный объект json, а не объект массива json.

Чтобы решить эту проблему, нам нужна библиотека, которая поддерживает все типы данных Json. Мы можем использовать преобразование xslt для решения этой проблемы. В XSLT 3.0 есть две функции json-to-xml() и xml-to-json(), которые идеально подходят для решения этой проблемы. Я решил аналогичную проблему, используя этот способ. Эти функции преобразуют json в xml и наоборот, учитывая все типы данных json. для например. В json, если вы укажете значение в виде числа, логическая или строковая библиотека будет поддерживать эти типы данных во время преобразования (xml в json или наоборот, чтобы после преобразования в xml вы могли видеть конкретный тип данных значения в сгенерированном xml). Мы можем видеть в сгенерированном xml, что любой ключ в json всегда имеет строковый тип.

Подробнее по ссылке ниже Преобразование xml и xml в json

Проверьте оба примера преобразования по ссылкам xsltfiddle ниже.

Преобразование json в xml

https://xsltfiddle.liberty-development.net/6qVRKvS

вернуть Json из предыдущего xml

https://xsltfiddle.liberty-development.net/94hvTyU

Ниже приведен полный пример Java этого преобразования с использованием XSLT и Saxon 9.8 HE (HE означает домашнюю версию. Это продукт с открытым исходным кодом, обеспечивающий реализацию XSLT (3.0)

Сначала вам нужно запустить json2XML.java, который сгенерирует outputSampleXML.xml. Этот outputSample.XML будет иметь преобразование из json в xml, и он будет вводом нашей следующей программы с именем xml2json.java. Эта программа вернет вам исходный json, содержащий один элемент массива.

pom.xml зависимость

    <dependency>
        <groupId>net.sf.saxon</groupId>
        <artifactId>Saxon-HE</artifactId>
        <version>9.8.0-8</version>
    </dependency>
<!-- Below just to pretty print json on console-->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.2</version>
    </dependency>

inputJSON.xml

<your_data_here>
{
    "Request": [{
        "price": "1400",
        "test": "dummydata"
    }]
}
</your_data_here>

json2xml.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">
    <xsl:output indent="yes" />
    <xsl:template match="your_data_here">
        <xsl:copy-of select="json-to-xml(.)" />
    </xsl:template>
</xsl:stylesheet>

json2XML.java

public class json2XML {
public static void simpleTransform(String sourcePath, String xsltPath, String resultDir) {
    TransformerFactory tFactory = TransformerFactory.newInstance();
    try {
        Transformer transformer = tFactory.newTransformer(new StreamSource(new File(xsltPath)));
        transformer.transform(new StreamSource(new File(sourcePath)), new StreamResult(new File(resultDir)));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public static void main(String[] args) {
    simpleTransform("src/main/java/sampleJSON.xml", "src/main/java/json2xml.xsl",
            "src/main/java/outputSampleXML.xml");
    System.out.println("Done!!!");

}

}

выводSampleXML.xml

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
   <array key="Request">
      <map>
         <string key="price">1400</string>
         <string key="test">dummydata</string>
      </map>
   </array>
</map>

xml2json.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">
  <xsl:output omit-xml-declaration="yes"/>
  <xsl:template match="/">
      <xsl:value-of select="xml-to-json(., map { 'indent' : true() })"/>
  </xsl:template>
</xsl:stylesheet>

xml2JSON.java

public class json2XML {
public static void simpleTransform(String sourcePath, String xsltPath, String resultDir) {
    TransformerFactory tFactory = TransformerFactory.newInstance();
    try {
        Transformer transformer = tFactory.newTransformer(new StreamSource(new File(xsltPath)));
        transformer.transform(new StreamSource(new File(sourcePath)), new StreamResult(new File(resultDir)));
    } catch (Exception e) {
        e.printStackTrace();
    }
}
public static void main(String[] args) {
    simpleTransform("src/main/java/sampleJSON.xml", "src/main/java/json2xml.xsl",
            "src/main/java/outputSampleXML.xml");
    System.out.println("Done!!!");

}

}

Вывод на консоль при запуске xml2JSON.java

{
    "Request": [{
        "price": "1400",
        "test": "dummydata"
    }]
}

Обратите внимание, что вы можете сохранить оба файла xsl в объекте java String как константу и использовать их как inputStream в коде Java преобразователя. Так что вам не нужно будет делать отдельные файлы xsl. Но это другая часть проблемы, и на ней не нужно концентрироваться.

person Pradeep Singh    schedule 24.04.2018

Underscore-java может конвертировать json в xml и наоборот. Я куратор проекта.

Результирующий xml:

<?xml version="1.0" encoding="UTF-8"?>
<readResult>
  <errors array="true">
    <code number="true">400</code>
  </errors>
</readResult>
person Valentyn Kolesnikov    schedule 12.11.2019

Невозможно, чтобы из строки XML

<readResult>
     <errors>
           <code>400</code>
     </errors>
 </readResult>

, библиотека может "догадаться", что code является массивом

Чтобы делать такие вещи, вам нужно будет пройти через модель Java и использовать библиотеку, такую ​​​​как Jackson восстановить JSON

Существует несколько альтернатив для преобразования XML в Java: XStream — одна из них.

person Bruno Grieder    schedule 20.03.2017
comment
У меня есть json в начале, при преобразовании json в xml должен быть какой-то атрибут флага, который может определить, является ли элемент xml массивом. Я посмотрю на XStream, если смогу найти какое-то решение. - person vashishth; 21.03.2017
comment
Вы можете использовать функцию json-to-xml() из XSLT 3.0: w3.org/ TR/xslt-30/#json-to-xml-mapping - person Martynas Jusevičius; 09.12.2017

Возможно, вам помогут описанные здесь сопоставления JSON-XML:

Средства чтения и записи, созданные JsonReaderWriterFactory предоставляет XML API поверх содержимого JavaScript Object Notation (JSON). (источник)

Он может конвертировать:

{
    "readResult": {
        "errors": [{
            "code": 400
        }]
    }
}

to:

<root type="object">
    <readResult type="object">
        <errors type="array">
            <item type="object"><code type="number">400</code></item>
        </errors>
    </readResult>
</root>

NB: я также реализовал это преобразование в JavaScript и в PHP.

person mevdschee    schedule 25.03.2017