使用 Java 将 xml 转换为 json

Posted

技术标签:

【中文标题】使用 Java 将 xml 转换为 json【英文标题】:Convert xml to json with Java 【发布时间】: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 的规范映射。属性或命名空间呢?既包含文本又包含其他元素的元素呢? Quickest way to convert XML to JSON in Java 的可能重复项 @Dominic - 有什么办法可以删除根元素,反之亦然吗? 【参考方案1】:
import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;

XML.toJSONObject(xml_text).toString()

org.json.XML

【讨论】:

如果有人想知道如何获取这个库 jar,给你:mvnrepository.com/artifact/org.json/json @All- 请指导***.com/questions/59450130/…【参考方案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());
        
    

【讨论】:

链接失效 是的,链接已关闭,但json.org 包含一个“Java”部分,其中包含所有可用的开源库来处理 JSON。我使用了这个库:mvnrepository.com/artifact/org.json/json【参考方案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】:

您可以使用标准工具

    使用工具 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

    读入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>

【讨论】:

以上是关于使用 Java 将 xml 转换为 json的主要内容,如果未能解决你的问题,请参考以下文章

将 XML 转换为 Java 中的 JSON,其中子节点作为数组

将 XML 转换为 JSON 格式

在java中将带有命名空间的xml转换为json

Java将XML类型的文本转换为JSON

JSON转换为Java中具有类型属性的XML

将xml转换为json android