使用Java将xml转换为json

时间:2015-02-11 09:59:27

标签: java xml json

有没有办法将xml文件转换为json? XML可以是任何结构,因此没有用于实例化的POJO类。我需要将xml转换为json或转换为没有根节点的Map。

例如:

<import name="person">
    <item>
        <firstName>Emil</firstName>
        <lastName>Example</lastName>
        <addresses>
            <address>
                <street>Example Blvd.</street>
            </address>
            <address>
                <street>Example Ave.</street>
            </address>
        </addresses>
    </item>
</import>

预期的JSON

{
    "firstName": "Emil",
    "lastName": "Example",
    "addresses": [
        { "street" : "Example Blvd." },
        { "street" : "Example Ave." }
    ]
}

7 个答案:

答案 0 :(得分:16)

import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;

XML.toJSONObject(xml_text).toString()

org.json.XML

答案 1 :(得分:8)

您可以使用json.org

中的JSON和XML库
import org.json.JSONObject;
import org.json.XML;
import org.junit.Test;

public class XmlToJsonTest {
    private static final String XML_TEXT = "<note>\n" +
            "<to>Tove</to>\n" +
            "<from>Jani</from>\n" +
            "<heading>Reminder</heading>\n" +
            "<body>Don't forget me this weekend!</body>\n" +
            "</note>";
    private static final int PRETTY_PRINT_INDENT_FACTOR = 4;

    @Test
    public void convert() {
        JSONObject xmlJSONObj = XML.toJSONObject(XML_TEXT);
        String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
        System.out.println(jsonPrettyPrintString);
    }
}

来源

<note>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

输出

{"note": {
    "heading": "Reminder",
    "from": "Jani",
    "to": "Tove",
    "body": "Don't forget me this weekend!"
}}

答案 2 :(得分:3)

如果您使用的是 Java 8 ,则应该查看我的开源库:unXml。 unXml基本上从Xpath映射到Json属性。

可在Maven Central上找到。

实施例

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.nerdforge.unxml.factory.ParsingFactory;
import com.nerdforge.unxml.parsers.Parser;
import org.w3c.dom.Document;

public class ParserExample {
    public ObjectNode parseXml(String xml){
        Parsing parsing = ParsingFactory.getInstance().create();
        Document document = parsing.xml().document(xml);

        Parser<ObjectNode> parser = parsing.obj("//item")
            .attribute("firstName", "firstName")
            .attribute("lastName", "lastName")
            .attribute("addresses", parsing.arr("addresses/address", parsing.obj()
                .attribute("street", "street")
            ))
            .build();

        ObjectNode result = parser.apply(document);
        return result;
    }
}

它将返回Jackson ObjectNode,并带有您示例中的json。

答案 3 :(得分:1)

在这个website上,您可以找到一些有用的课程。

public class Main {

    public static int PRETTY_PRINT_INDENT_FACTOR = 4;
    public static String TEST_XML_STRING = "Your xml string here";

    public static void main(String[] args) {
        try {
            JSONObject xmlJSONObj = XML.toJSONObject(TEST_XML_STRING);
            String jsonPrettyPrintString = xmlJSONObj.toString(PRETTY_PRINT_INDENT_FACTOR);
            System.out.println(jsonPrettyPrintString);
        } catch (JSONException je) {
            System.out.println(je.toString());
        }
    }
}

答案 4 :(得分:1)

我使用了JSON-java,但我发现更多高效库将 XML 转换为 Json {{ 3}}

Json

获得XML的最佳自定义

libary依赖项添加到您的APP build.gradle文件

dependencies {
compile 'com.github.smart-fun:XmlToJson:1.4.4'    // add this line
}
    <?xml version="1.0" encoding="utf-8"?>
    <library>
    <book id="007">James Bond</book>
    <book id="000">Book for the dummies</book>
    </library>
  • 自定义内容名称

    public String convertXmlToJson(String xml) {
    XmlToJson xmlToJson = new XmlToJson.Builder(xml)
        .setContentName("/library/book", "title")
        .build();
    return xmlToJson.toString();
    }
    
    "library":{  
      "book":[  
         {  
            "id":"007",
            "title":"James Bond"
         },
         {  
            "id":"000",
            "title":"Book for the dummies"
         }
       ]
      }
     }
    
  • 自定义属性名称

    public String convertXmlToJson(String xml) {
      XmlToJson xmlToJson = new XmlToJson.Builder(xml)
        .setAttributeName("/library/book/id", "code")
        .build();
      return xmlToJson.toString();
    }
    
    {  
      "library":{  
      "book":[  
         {  
            "code":"007",
            "content":"James Bond"
         },
         {  
            "code":"000",
            "content":"Book for the dummies"
         }
      ]
     }
    }
    

以及更有效的自定义Json技术

<强> XmlToJson

答案 5 :(得分:0)

Underscore-java库有静态方法xmlToJson。我是该项目的维护者。 Live example

import com.github.underscore.lodash.U;

public class Main {
    public static void main(String[] args) {
        final String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<root>\n"
            + "  <FirstItem>1</FirstItem>\n  <SecondItem>2</SecondItem>\n</root>";
        System.out.println(U.xmlToJson(xml));
    }
}

答案 6 :(得分:0)

您可以使用标准工具

  1. 使用jdk中的xjc工具generate Java classes from schema

      

    Java 9开始,您必须使用–add-modules java.se.ee显式添加JAXB作为模块   请参阅:How to resolve java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException in Java 9

  2. 自Java 11起,您必须在https://javaee.github.io/jaxb-v2/

    的额外步骤中下载xjc
    1. 使用Jackson
    2. XML的身份写下JSON

      示例

      https://schema.datacite.org/meta/kernel-4.1/metadata.xsd

      <强> 1。使用jdk中的xjc工具

      在我的示例中,我将使用基于datacite模式的相当复杂的示例。

      /path/to/jdk/bin/xjc -d /path/to/java/project \
      -p stack24174963.datacite \
       https://schema.datacite.org/meta/kernel-4.1/metadata.xsd
      

      这将回复

      parsing a schema...
      compiling a schema...
      stack24174963/datacite/Box.java
      stack24174963/datacite/ContributorType.java
      stack24174963/datacite/DateType.java
      stack24174963/datacite/DescriptionType.java
      stack24174963/datacite/FunderIdentifierType.java
      stack24174963/datacite/NameType.java
      stack24174963/datacite/ObjectFactory.java
      stack24174963/datacite/Point.java
      stack24174963/datacite/RelatedIdentifierType.java
      stack24174963/datacite/RelationType.java
      stack24174963/datacite/Resource.java
      stack24174963/datacite/ResourceType.java
      stack24174963/datacite/TitleType.java
      stack24174963/datacite/package-info.java
      

      <强> 2。请使用杰克逊

      XML身份写为JSON
        import com.fasterxml.jackson.databind.ObjectMapper;
        import com.fasterxml.jackson.databind.SerializationFeature;
      
        import stack24174963.datacite.Resource;
      
        public class HowToXmlToJsonWithSchema {
          @Test
          public void readXmlAndConvertToSchema() throws Exception {
              String example = "schemas/datacite/kernel-4.1/example/datacite-example-complicated-v4.1.xml";
              try (InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream(example)) {
                  Resource resource = JAXB.unmarshal(in, Resource.class);
                  System.out.println(asJson(resource));
              }
          }
      
          private String asJson(Object obj) throws Exception {
              StringWriter w = new StringWriter();
              new ObjectMapper().configure(SerializationFeature.INDENT_OUTPUT, true).writeValue(w, obj);
              String result = w.toString();
              return result;
          }
        }
      

      打印:

       {
            "identifier" : {
              "value" : "10.5072/testpub",
              "identifierType" : "DOI"
            },
            "creators" : {
              "creator" : [ {
                "creatorName" : {
                  "value" : "Smith, John",
                  "nameType" : "PERSONAL"
                },
                "givenName" : "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<givenName xmlns=\"http://datacite.org/schema/kernel-4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">John</givenName>",
                "familyName" : "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<familyName xmlns=\"http://datacite.org/schema/kernel-4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Smith</familyName>",
                "nameIdentifier" : [ ],
                "affiliation" : [ ]
              }, {
                "creatorName" : {
                  "value" : "つまらないものですが",
                  "nameType" : null
                },
                "givenName" : null,
                "familyName" : null,
                "nameIdentifier" : [ {
                  "value" : "0000000134596520",
                  "nameIdentifierScheme" : "ISNI",
                  "schemeURI" : "http://isni.org/isni/"
                } ],
                "affiliation" : [ ]
              } ]
            },
            "titles" : {
              "title" : [ {
                "value" : "Właściwości rzutowań podprzestrzeniowych",
                "titleType" : null,
                "lang" : "pl"
              }, {
                "value" : "Translation of Polish titles",
                "titleType" : "TRANSLATED_TITLE",
                "lang" : "en"
              } ]
            },
            "publisher" : "Springer",
            "publicationYear" : "2010",
            "resourceType" : {
              "value" : "Monograph",
              "resourceTypeGeneral" : "TEXT"
            },
            "subjects" : {
              "subject" : [ {
                "value" : "830 German & related literatures",
                "subjectScheme" : "DDC",
                "schemeURI" : null,
                "valueURI" : null,
                "lang" : "en"
              }, {
                "value" : "Polish Literature",
                "subjectScheme" : null,
                "schemeURI" : null,
                "valueURI" : null,
                "lang" : "en"
              } ]
            },
            "contributors" : {
              "contributor" : [ {
                "contributorName" : {
                  "value" : "Doe, John",
                  "nameType" : "PERSONAL"
                },
                "givenName" : "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<givenName xmlns=\"http://datacite.org/schema/kernel-4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">John</givenName>",
                "familyName" : "<?xml version=\"1.0\" encoding=\"UTF-16\"?>\n<familyName xmlns=\"http://datacite.org/schema/kernel-4\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">Doe</familyName>",
                "nameIdentifier" : [ {
                  "value" : "0000-0001-5393-1421",
                  "nameIdentifierScheme" : "ORCID",
                  "schemeURI" : "http://orcid.org/"
                } ],
                "affiliation" : [ ],
                "contributorType" : "DATA_COLLECTOR"
              } ]
            },
            "dates" : null,
            "language" : "de",
            "alternateIdentifiers" : {
              "alternateIdentifier" : [ {
                "value" : "937-0-4523-12357-6",
                "alternateIdentifierType" : "ISBN"
              } ]
            },
            "relatedIdentifiers" : {
              "relatedIdentifier" : [ {
                "value" : "10.5272/oldertestpub",
                "resourceTypeGeneral" : null,
                "relatedIdentifierType" : "DOI",
                "relationType" : "IS_PART_OF",
                "relatedMetadataScheme" : null,
                "schemeURI" : null,
                "schemeType" : null
              } ]
            },
            "sizes" : {
              "size" : [ "256 pages" ]
            },
            "formats" : {
              "format" : [ "pdf" ]
            },
            "version" : "2",
            "rightsList" : {
              "rights" : [ {
                "value" : "Creative Commons Attribution-NoDerivs 2.0 Generic",
                "rightsURI" : "http://creativecommons.org/licenses/by-nd/2.0/",
                "lang" : null
              } ]
            },
            "descriptions" : {
              "description" : [ {
                "content" : [ "\n      Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea\n      takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores\n      et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n    " ],
                "descriptionType" : "ABSTRACT",
                "lang" : "la"
              } ]
            },
            "geoLocations" : null,
            "fundingReferences" : null
          }
      

      例如输入XML:

        <?xml version="1.0" encoding="UTF-8"?>
        <resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://datacite.org/schema/kernel-4" xsi:schemaLocation="http://datacite.org/schema/kernel-4 http://schema.datacite.org/meta/kernel-4.1/metadata.xsd">
          <identifier identifierType="DOI">10.5072/testpub</identifier>
          <creators>
            <creator>
              <creatorName nameType="Personal">Smith, John</creatorName>
              <givenName>John</givenName>
              <familyName>Smith</familyName>
            </creator>
            <creator>
              <creatorName>つまらないものですが</creatorName>
              <nameIdentifier nameIdentifierScheme="ISNI" schemeURI="http://isni.org/isni/">0000000134596520</nameIdentifier>
            </creator>
          </creators>
          <titles>
            <title xml:lang="pl">Właściwości rzutowań podprzestrzeniowych</title>
            <title xml:lang="en" titleType="TranslatedTitle">Translation of Polish titles</title>
          </titles>
          <publisher>Springer</publisher>
          <publicationYear>2010</publicationYear>
          <subjects>
            <subject xml:lang="en" subjectScheme="DDC">830 German &amp; related literatures</subject>
            <subject xml:lang="en">Polish Literature</subject>
          </subjects>
          <contributors>
            <contributor contributorType="DataCollector">
              <contributorName nameType="Personal">Doe, John</contributorName>
              <givenName>John</givenName>
              <familyName>Doe</familyName>
              <nameIdentifier nameIdentifierScheme="ORCID" schemeURI="http://orcid.org/">0000-0001-5393-1421</nameIdentifier>
            </contributor>
          </contributors>
          <language>de</language>
          <resourceType resourceTypeGeneral="Text">Monograph</resourceType>
          <alternateIdentifiers>
            <alternateIdentifier alternateIdentifierType="ISBN">937-0-4523-12357-6</alternateIdentifier>
          </alternateIdentifiers>
          <relatedIdentifiers>
            <relatedIdentifier relatedIdentifierType="DOI" relationType="IsPartOf">10.5272/oldertestpub</relatedIdentifier>
          </relatedIdentifiers>
          <sizes>
            <size>256 pages</size>
          </sizes>
          <formats>
            <format>pdf</format>
          </formats>
          <version>2</version>
          <rightsList>
            <rights rightsURI="http://creativecommons.org/licenses/by-nd/2.0/">Creative Commons Attribution-NoDerivs 2.0 Generic</rights>
          </rightsList>
          <descriptions>
            <description xml:lang="la" descriptionType="Abstract">
              Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea
              takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
              et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
            </description>
          </descriptions>
        </resource>