Java 将JSON文件转换为特定的XML格式

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

问题

我正在解决一个问题,需要获取JSON输入文件并转换为XML文件。下面我举了一个例子来说明我的想法

在JSON中:

"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并查找“playerStats”
  • 如果找不到,什么也不做
  • 如果找到了,那么抓取有价值的信息,比如jerseyNumber、fgPercentage,忽略plusMinus并将它们存储在模板类的对象中,并使用这些值
  • 然后使用该对象生成适当的XML标记
  • 我不确定我的方法是否有效。我很想听到建议,我正在用Java做这件事,所以请随意参考任何可靠和流行的库。我希望看到所有的方法,如果您提供代码片段,甚至更好。

    一个选项是在XSLT 3.0中使用

    您需要一个XSLT3.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”))//
    一个选项是在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)); 
        }
    }