【问题标题】:Convert xml to json with Java使用 Java 将 xml 转换为 json
【发布时间】:2015-04-11 15:33:15
【问题描述】:

有没有办法将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." }
    ]
}

【问题讨论】:

  • 您听说过 SAX 或 DOM 解析器吗?使用基本的 XML 解析应该相当容易。
  • 没有从 XML 到 JSON 的规范映射。属性或命名空间呢?既包含文本又包含其他元素的元素呢?
  • @Dominic - 有什么办法可以删除根元素,反之亦然吗?

标签: java xml json


【解决方案1】:
import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;

XML.toJSONObject(xml_text).toString()

org.json.XML

【讨论】:

【解决方案2】:

您可以使用来自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!"
}}

【讨论】:

  • 这不是我想要的(“没有根节点”)。
  • 只删除第一个和最后一个符号)
【解决方案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;
    }
}

它将返回一个JacksonObjectNode,并带有您示例中的json。

【讨论】:

    【解决方案4】:

    website 上,您可以找到一些对您的任务有用的类(在页面底部的 java 部分中)。

    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());
            }
        }
    }
    

    【讨论】:

    【解决方案5】:

    Underscore-java 库有静态方法U.xmlToJson(xml)Live example

    import com.github.underscore.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));
        }
    }
    

    【讨论】:

    • 有什么方法可以删除 XML 根标签并简单地创建 json?反之亦然?
    • 可以将xml转成map,编辑map再生成json。
    • 能否分享源代码示例?
    【解决方案6】:

    我使用过JSON-java,但我发现将XML转换为Json更高效的库是XmlToJson

    XML 制作Json 的最佳定制是什么

    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 技术

    Click here to Check out on Github

    【讨论】:

      【解决方案7】:

      您可以使用标准工具

      1. 使用工具 xjc 从你的 jdk 到 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

      从 Java 11 开始,您必须在 https://javaee.github.io/jaxb-v2/ 的额外步骤中下载 xjc

      1. 读入XML写出JSON使用Jackson

      示例

      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 使用Jackson

        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>
      

      【讨论】:

        猜你喜欢
        • 2016-07-17
        • 2019-10-20
        • 1970-01-01
        • 2020-09-23
        • 1970-01-01
        • 2014-08-02
        • 2013-11-27
        • 2013-06-01
        相关资源
        最近更新 更多