是否有将 Java POJO 转换为 JSON 和 XML 的库? [关闭]
Posted
技术标签:
【中文标题】是否有将 Java POJO 转换为 JSON 和 XML 的库? [关闭]【英文标题】:Is there a library to convert Java POJOs to and from JSON and XML? [closed] 【发布时间】:2010-10-14 02:56:21 【问题描述】:我有一个对象图,我想在 JSON 和 XML 之间进行转换,以创建 REST 样式的 API。我觉得肯定有人已经这样做了,但是使用 Google 和 Stack Overflow 快速搜索什么也没有发现。
是否有人知道合适的(首选 Apache 或同等许可)库来执行此操作?
【问题讨论】:
达伦,您是否成功地挖掘了 (XMLJSON)。我正在研究没有 POJO 的情况,我需要处理未知的 JSON 元素,我正在处理向量,努力工作,但还没有解决方案。干杯 不幸的是,XMLJSON 是非常有问题的,因为数据模型比人们想象的要大得多——基本上是因为 XML 在“对象”和“数组”之间没有区别,不像 JSON 【参考方案1】:我认为您可能正在寻找类似于此处的内容:JSON.org Java section
【讨论】:
这门课你成功了吗?我运行了一些测试并得到了一个无限循环。我需要在没有 Pojo 的情况下将通用 JSON 解析为 XML。 我实际上已经使用了 XStream,它似乎运行良好。【参考方案2】:对于 POJO 到 XML,我建议使用 JAXB(还有其他库,例如 XStream,但 JAXB 是标准化的)。
对于 JSON,我什么都不知道,但如果你想实现一个 RESTful API,你可能会对 JSR-311 感兴趣,它定义了一个用于 RESTful API 的服务器端 API 和 Jersey,这是它的参考实现.
【讨论】:
JAXB 很可能是标准化的,但它不能很好地收集。【参考方案3】:Json-lib 在 Apache 2.0 许可下获得许可。
它还可以将 JSON 对象转换为 XML,但您需要先通过它将 POJO 转换为 JSON。
【讨论】:
对于 XML 听起来不太好,但对于 JSON 看起来不错【参考方案4】:对 xml 使用 Xstream http://x-stream.github.io/,对 JSON 使用 JSON http://www.json.org/java/。我不认为有一个图书馆可以两者兼得。
或者编写一个包装器,根据您的需要委托给 XStream 渲染器/JSON 渲染器。
【讨论】:
Xstream 支持序列化为 JSON:xstream.codehaus.org/json-tutorial.html 我尝试了 Xstream,但发现 JsonHierarchicalStreamDriver 和 JettisonMappedXmlDriver 存在各种限制。 1) Stream 驱动不能反序列化它只能序列化 2) 映射的 xml 驱动可以两者都做,但不能产生漂亮的 JSON 如果上面的约束没问题,XSTREAM 是一个不错的选择。【参考方案5】:我个人会分别处理这两个问题;并通过 JSON Pojo XML 转换 JSONXML。
这样:JavaPOJO 和 JAXB(http://jaxb.dev.java.net;也与 JDK 1.6 捆绑在一起)和注释(XStream 也可以);对于 JSON,Jackson 的 ObjectMapper (http://jackson.codehaus.org/Tutorial)。与 Jersey 配合得很好,我自己也在使用它(当前 Jersey 版本默认不捆绑完整的 Pojo 数据绑定,但会在不久的将来)
我实际上不会使用任何 xml 库来生成“json”:XStream 和 JAXB/Jettison 可以生成某种 JSON,但它使用了相当不直观的丑陋约定。
编辑(2011 年 7 月 18 日):Jackson 实际上有一个名为“jackson-xml-databind”的扩展,它可以读/写 XML,类似于 JAXB。所以它可以用于 JSON 和 XML,与 POJO 之间的往来。
【讨论】:
【参考方案6】:上次我在网站上看到,XStream 两者都可以。它支持 XML 和 JSON 作为序列化目标。
【讨论】:
【参考方案7】:GSON 来自谷歌:http://code.google.com/p/google-gson/,
或
Jackson春季使用的库:https://github.com/FasterXML/jackson
我同意其他人建议将 jaxb 用于 XML 到 pojo,很好地支持很多工具:它是标准。
【讨论】:
作为额外的奖励,Jackson 还可以做 XML,github.com/FasterXML/jackson-dataformat-xml 这是 Jackson 页面上的许可证信息链接 - moinmo.in/GPL。据我了解 - 由于 Jackson 拥有 GPL 许可证,因此任何想要对其代码保密的非开源软件都无法使用 Jackson。【参考方案8】:注意:我是EclipseLink JAXB (MOXy) 领导,也是JAXB (JSR-222) 专家组的成员。
EclipseLink JAXB (MOXy) 支持将单个对象模型映射到具有相同元数据的 XML 和 JSON:
http://blog.bdoughan.com/2011/08/binding-to-json-xml-geocode-example.html许可证信息
http://wiki.eclipse.org/EclipseLink/FAQ/General#How_is_EclipseLink_Licensed.3F域模型
下面是我们将用于此示例的域模型。对于这个例子,我只是使用标准 JAXB (JSR-222) 注释,这些注释自 Java SE 6 起就在 JDK/JRE 中可用。
客户
package forum658936;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer
String firstName;
@XmlElement(nillable=true)
String lastName;
@XmlElement(name="phone-number")
List<PhoneNumber> phoneNumbers;
电话号码
package forum658936;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber
@XmlAttribute
int id;
@XmlValue
String number;
jaxb.properties
要将 MOXy 指定为您的 JAXB 提供程序,您需要在与域模型相同的包中包含一个名为 jaxb.properties
的文件,并使用以下条目(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
XML
input.xml
这是我们的演示代码将读取并转换为域对象的 XML。
<?xml version="1.0" encoding="UTF-8"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<firstName>Jane</firstName>
<lastName xsi:nil="true"/>
<phone-number id="123">555-1234</phone-number>
</customer>
关于 XML 的注意事项:
xsi:nil
属性用于表示lastName
为空。
phone-number
元素是具有简单内容的复杂类型(请参阅:http://blog.bdoughan.com/2011/06/jaxb-and-complex-types-with-simple.html)。
JSON
输出
下面是运行演示代码输出的 JSON。
"firstName" : "Jane",
"lastName" : null,
"phone-number" : [
"id" : 123,
"value" : "555-1234"
]
关于 JSON 的注意事项:
null
值用于表示lastName
为空。不存在 xsi:nil
属性。
电话号码集合的大小为 1,并正确地用方括号绑定。许多库错误地将大小为 1 的集合视为 JSON 对象。
int
类型的 property
被正确编组,不带引号。
在 XML 表示中 id
是一个属性,但在 JSON 表示中不需要特别表示。
演示代码
在下面的演示代码中,我们会将 XML 文档转换为对象,然后将这些相同的实例转换为 JSON。
演示
MOXy 不只是解释 JAXB 注释,它是一个 JAXB 实现,因此使用标准 JAXB 运行时 API。通过在 Marshaller
上指定 MOXy 指定属性来启用 JSON 绑定。
package forum658936;
import java.io.File;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;
public class Demo
public static void main(String[] args) throws Exception
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum658936/input.xml");
Customer customer = (Customer) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
marshaller.marshal(customer, System.out);
【讨论】:
这看起来很有希望!【参考方案9】:看看 Genson 库http://code.google.com/p/genson/wiki/GettingStarted。
它易于使用、性能卓越,并且在设计时考虑了扩展。 实际上它进行 json/java 转换但不是 xml。不过,未来版本可能会添加对 xml 的支持。
我在 web 应用程序和 jersey 的 REST web 服务中使用它,但在某些情况下也将其 json 形式的对象存储到数据库中。
啊,它在 Apache 2.0 许可下。
【讨论】:
【参考方案10】:几乎有数百个。我最喜欢的是 POJO JSON 的 GSON 和 POJO XML 的 castor-xml。
作为奖励,两者都在 Apache License 2.0 风格的许可下获得许可。
【讨论】:
以上是关于是否有将 Java POJO 转换为 JSON 和 XML 的库? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
R或Java:是不是有将邮政编码转换为纬度和经度并放在地图上的包?
使用jackson将pojo(对象列表)转换为java中的json
Android java:如何创建 POJO 并将其转换为 Cloud Firestore REST API 可接受的 JSON