使用 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 & 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的主要内容,如果未能解决你的问题,请参考以下文章