Java 将JSON文件转换为特定的XML格式
问题 我正在解决一个问题,需要获取JSON输入文件并转换为XML文件。下面我举了一个例子来说明我的想法 在JSON中:Java 将JSON文件转换为特定的XML格式,java,json,xml,jaxb,jsonparser,Java,Json,Xml,Jaxb,Jsonparser,问题 我正在解决一个问题,需要获取JSON输入文件并转换为XML文件。下面我举了一个例子来说明我的想法 在JSON中: "playerStats": [ { "jerseyNumber": "23", "fgPercentage": 60, "plusMinus": "plus" }, { "jerseyNumber": "24", "fgPercentage": 40, "plusMinus": "minus" } ] } 在XML中: <BallerStats&g
"playerStats": [
{ "jerseyNumber": "23", "fgPercentage": 60, "plusMinus": "plus" },
{ "jerseyNumber": "24", "fgPercentage": 40, "plusMinus": "minus" }
] }
在XML中:
<BallerStats>
<BallerStat>
<Baller><BallerJersey>23</BallerJersey><Type>Jersey</Type></Baller>
<fgPercentage><Type>PERCENT</Type><Value>60</Value></fgPercentage>
</BallerStat>
<BallerStat>
<Baller><BallerJersey>23</BallerJersey><Type>Jersey</Type></Baller>
<fgPercentage><Type>PERCENT</Type><Value>60</Value></fgPercentage>
</BallerStat>
</BallerStats>
23泽西岛
百分之六十
23泽西岛
百分之六十
正如您所看到的,这不是一个1:1的比率,在JSON中,我们将fgPercentage表示为60,但在xml中,我们通过“值”和“类型”将其分开
某些标记名也不同。在JSON中,我们称它们为“playerStats”,在XML中,我们称它们为等价的标记“BallerStats”
解决方案
请记住,JSON文件可以包含除球员状态之外的许多其他字段,如教练状态或球迷状态,但我们只关心球员状态
下面是我想到的,但我可能又错了
json-to-xml()
的结果如下所示:
<map xmlns="http://www.w3.org/2005/xpath-functions">
<array key="playerStats">
<map>
<string key="jerseyNumber">23</string>
<number key="fgPercentage">60</number>
<string key="plusMinus">plus</string>
</map>
<map>
<string key="jerseyNumber">24</string>
<number key="fgPercentage">40</number>
<string key="plusMinus">minus</string>
</map>
</array>
</map>
23
60
加
24
40
减
您可以处理该XML以获得目标XML
例如
Java
package so.test1;
import java.io.File;
import java.io.OutputStream;
import javax.xml.transform.stream.StreamSource;
import net.sf.saxon.s9api.XsltTransformer;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
import net.sf.saxon.s9api.XdmAtomicValue;
import net.sf.saxon.s9api.XsltCompiler;
import net.sf.saxon.s9api.XsltExecutable;
/**
*
* @author dhaley
*
*/
public class SOTest1 {
public static void main(String[] args) throws SaxonApiException {
final String XSLT_PATH = "src/so/test1/test.xsl";
final String JSON = "{\"playerStats\": [\n" +
" {\"jerseyNumber\": \"23\", \"fgPercentage\": 60, \"plusMinus\": \"plus\"},\n" +
" {\"jerseyNumber\": \"24\", \"fgPercentage\": 40, \"plusMinus\": \"minus\"}\n" +
"]}";
OutputStream outputStream = System.out;
Processor processor = new Processor(false);
Serializer serializer = processor.newSerializer();
serializer.setOutputStream(outputStream);
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable executable = compiler.compile(new StreamSource(new File(XSLT_PATH)));
XsltTransformer transformer = executable.load();
transformer.setInitialTemplate(new QName("init")); //<-- SET INITIAL TEMPLATE
transformer.setParameter(new QName("json"), new XdmAtomicValue(JSON)); //<-- PASS JSON IN AS PARAM
transformer.setDestination(serializer);
transformer.transform();
}
}
包so.test1;
导入java.io.File;
导入java.io.OutputStream;
导入javax.xml.transform.stream.StreamSource;
导入net.sf.saxon.s9api.XsltTransformer;
导入net.sf.saxon.s9api.Processor;
导入net.sf.saxon.s9api.QName;
导入net.sf.saxon.s9api.SaxonApiException;
导入net.sf.saxon.s9api.Serializer;
导入net.sf.saxon.s9api.xdmotomicvalue;
导入net.sf.saxon.s9api.XsltCompiler;
导入net.sf.saxon.s9api.XsltExecutable;
/**
*
*@作者达利
*
*/
公共类SOTest1{
公共静态void main(字符串[]args)抛出SaxonapieException{
最终字符串XSLT_PATH=“src/so/test1/test.xsl”;
最后一个字符串JSON=“{\”playerStats\”:[\n”+
“{\'jerseyNumber\':\'23\',\'fgPercentage\':60,\'plusMinus\':\'plus\'”,\n”+
“{\'jerseyNumber\':\'24\',\'fgPercentage\':40,\'plusMinus\':\'minus\'”}\n”+
"]}";
OutputStream OutputStream=System.out;
处理器=新处理器(错误);
Serializer Serializer=处理器.newSerializer();
serializer.setOutputStream(outputStream);
XsltCompiler compiler=processor.newXsltCompiler();
XsltExecutable executable=compiler.compile(新的StreamSource(新文件(XSLT_路径));
XsltTransformer transformer=executable.load();
setInitialTemplate(新的QName(“init”))//
一个选项是在XSLT3.0中使用
您需要一个XSLT 3.0处理器;我在下面的示例中使用了它
您可以将JSON作为参数传入
json-to-xml()
的结果如下所示:
<map xmlns="http://www.w3.org/2005/xpath-functions">
<array key="playerStats">
<map>
<string key="jerseyNumber">23</string>
<number key="fgPercentage">60</number>
<string key="plusMinus">plus</string>
</map>
<map>
<string key="jerseyNumber">24</string>
<number key="fgPercentage">40</number>
<string key="plusMinus">minus</string>
</map>
</array>
</map>
23
60
加
24
40
减
您可以处理该XML以获得目标XML
例如
Java
package so.test1;
import java.io.File;
import java.io.OutputStream;
import javax.xml.transform.stream.StreamSource;
import net.sf.saxon.s9api.XsltTransformer;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
import net.sf.saxon.s9api.XdmAtomicValue;
import net.sf.saxon.s9api.XsltCompiler;
import net.sf.saxon.s9api.XsltExecutable;
/**
*
* @author dhaley
*
*/
public class SOTest1 {
public static void main(String[] args) throws SaxonApiException {
final String XSLT_PATH = "src/so/test1/test.xsl";
final String JSON = "{\"playerStats\": [\n" +
" {\"jerseyNumber\": \"23\", \"fgPercentage\": 60, \"plusMinus\": \"plus\"},\n" +
" {\"jerseyNumber\": \"24\", \"fgPercentage\": 40, \"plusMinus\": \"minus\"}\n" +
"]}";
OutputStream outputStream = System.out;
Processor processor = new Processor(false);
Serializer serializer = processor.newSerializer();
serializer.setOutputStream(outputStream);
XsltCompiler compiler = processor.newXsltCompiler();
XsltExecutable executable = compiler.compile(new StreamSource(new File(XSLT_PATH)));
XsltTransformer transformer = executable.load();
transformer.setInitialTemplate(new QName("init")); //<-- SET INITIAL TEMPLATE
transformer.setParameter(new QName("json"), new XdmAtomicValue(JSON)); //<-- PASS JSON IN AS PARAM
transformer.setDestination(serializer);
transformer.transform();
}
}
包so.test1;
导入java.io.File;
导入java.io.OutputStream;
导入javax.xml.transform.stream.StreamSource;
导入net.sf.saxon.s9api.XsltTransformer;
导入net.sf.saxon.s9api.Processor;
导入net.sf.saxon.s9api.QName;
导入net.sf.saxon.s9api.SaxonApiException;
导入net.sf.saxon.s9api.Serializer;
导入net.sf.saxon.s9api.xdmotomicvalue;
导入net.sf.saxon.s9api.XsltCompiler;
导入net.sf.saxon.s9api.XsltExecutable;
/**
*
*@作者达利
*
*/
公共类SOTest1{
公共静态void main(字符串[]args)抛出SaxonapieException{
最终字符串XSLT_PATH=“src/so/test1/test.xsl”;
最后一个字符串JSON=“{\”playerStats\”:[\n”+
“{\'jerseyNumber\':\'23\',\'fgPercentage\':60,\'plusMinus\':\'plus\'”,\n”+
“{\'jerseyNumber\':\'24\',\'fgPercentage\':40,\'plusMinus\':\'minus\'”}\n”+
"]}";
OutputStream OutputStream=System.out;
处理器=新处理器(错误);
Serializer Serializer=处理器.newSerializer();
serializer.setOutputStream(outputStream);
XsltCompiler compiler=processor.newXsltCompiler();
XsltExecutable executable=compiler.compile(新的StreamSource(新文件(XSLT_路径));
XsltTransformer transformer=executable.load();
setInitialTemplate(新的QName(“init”))//
库可以将json转换为xml。我是项目的维护者
导入com.github.underline.lodash.U;
导入java.util.ArrayList;
导入java.util.LinkedHashMap;
导入java.util.List;
导入java.util.Map;
公共类MyClass{
@抑制警告(“未选中”)
公共静态void main(字符串参数[]){
字符串json=“{\”playerStats\”:[\n”
+“{\'jerseyNumber\':\'23\',\'fgPercentage\':60,\'plusMinus\':\'plus\'”
+“{\'jerseyNumber\':\'24\',\'fgPercentage\':40,\'plusMinus\':\'minus\'”
+ "] }";
字符串xml=“”
+ ""
+“23泽西岛”
import com.github.underscore.lodash.U;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class MyClass {
@SuppressWarnings("unchecked")
public static void main(String args[]) {
String json = "{\"playerStats\": [\n"
+ "{ \"jerseyNumber\": \"23\", \"fgPercentage\": 60, \"plusMinus\": \"plus\" },"
+ "{ \"jerseyNumber\": \"24\", \"fgPercentage\": 40, \"plusMinus\": \"minus\" }"
+ "] }";
String xml = "<BallerStats>"
+ "<BallerStat>"
+ " <Baller><BallerJersey>23</BallerJersey><Type>Jersey</Type></Baller>"
+ " <fgPercentage><Type>PERCENT</Type><Value>60</Value></fgPercentage>"
+ "</BallerStat>"
+ "</BallerStats>";
List<Map<String, Object>> jsonArray = U.get((Map<String, Object>) U.fromJson( json ), "playerStats");
Map<String, Object> map = new LinkedHashMap<>();
List<Map<String, Object>> ballerStats = new ArrayList<>();
Map<String, Object> ballerStat = new LinkedHashMap<>();
map.put("BallerStats", ballerStat);
ballerStat.put("BallerStat", ballerStats);
for (Map<String, Object> jsonItem : jsonArray) {
Map<String, Object> newBallerStat = (Map<String, Object>) ((Map<String, Object>) ((Map<String, Object>) U.fromXml( xml )).get("BallerStats")).get("BallerStat");
((Map<String, Object>) newBallerStat.get("Baller")).put("BallerJersey", jsonItem.get("jerseyNumber"));
((Map<String, Object>) newBallerStat.get("fgPercentage")).put("Value", jsonItem.get("fgPercentage"));
ballerStats.add(newBallerStat);
}
System.out.println(U.toXml(map));
}
}