是否有将 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:是不是有将邮政编码转换为纬度和经度并放在地图上的包?

使用 Java 将 JSON 转换为 POJO 并赋值

将 Java pojo 转换为 json 字符串

使用jackson将pojo(对象列表)转换为java中的json

Android java:如何创建 POJO 并将其转换为 Cloud Firestore REST API 可接受的 JSON

是否有将值和错误转换为科学计数法的 python 模块?