Спецификация 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