是否有一个库可以将JavaPOJO与JSON和XML进行转换?

是否有一个库可以将JavaPOJO与JSON和XML进行转换?,java,xml,json,pojo,Java,Xml,Json,Pojo,为了创建一个REST风格的API,我有一个对象图,我想在JSON和XML之间进行转换。我突然想到,一定有人已经这么做了,但使用Google和Stack Overflow进行快速搜索,什么也没发现 有人知道有合适的(Apache或同等许可证首选)库来实现这一点吗?我想您可能正在寻找类似的东西:对于POJO到XML,我建议使用(还有其他库,例如XStream,但JAXB是标准化的) 对于JSON,我什么都不知道,但是如果您想实现RESTful API,您可能会对为RESTful API定义服务器端A

为了创建一个REST风格的API,我有一个对象图,我想在JSON和XML之间进行转换。我突然想到,一定有人已经这么做了,但使用Google和Stack Overflow进行快速搜索,什么也没发现


有人知道有合适的(Apache或同等许可证首选)库来实现这一点吗?

我想您可能正在寻找类似的东西:

对于POJO到XML,我建议使用(还有其他库,例如XStream,但JAXB是标准化的)

对于JSON,我什么都不知道,但是如果您想实现RESTful API,您可能会对为RESTful API定义服务器端API和它的参考实现感兴趣。

是根据Apache 2.0许可证授权的

它还可以将JSON对象转换为XML,但您需要首先通过它将POJO转换为JSON。

使用Xstream表示XML,使用JSON表示JSON。我认为没有一个图书馆能同时做到这两个方面


或者编写一个包装器,根据需要委托给XStream渲染器/JSON渲染器。

我个人会分别处理这两个问题;以及通过JSON Pojo XML转换JSONXML

有了它:JavaPOJO和JAXB(也与jdk1.6捆绑在一起)以及注释(XStream也可以);对于JSON,使用Jackson的ObjectMapper()。Jersey很好地工作,我自己也在使用它(当前的Jersey版本默认情况下不捆绑完整的Pojo数据绑定,但在不久的将来会捆绑)

实际上,我不会使用任何xml库来生成“json”:XStream和JAXB/Destinson可以生成某种json,但它使用了非常不直观的丑陋约定


编辑(2011年7月18日):Jackson实际上有一个名为“”的扩展,可以读/写XML,类似于JAXB。因此,它可以用于JSON和XML,以及从POJO到POJO的通信。

我在网站上看到的最后一个例子是,XStream可以同时完成这两个功能。它支持XML和JSON作为序列化目标

来自谷歌的GSON:

Jackson春季使用的图书馆:


我同意其他人提出的将jaxb for XML转换为pojo的建议,它支持很多工具:这是标准的。

注意:我是专家组的负责人和成员

EclipseLink JAXB(MOXy)支持使用相同元数据将单个对象模型映射到XML和JSON:

许可证信息


域模型

下面是我们将用于此示例的域模型。对于这个示例,我只是使用标准JAXB(JSR-222)注释,这些注释自JavaSE6以来就在JDK/JRE中可用

客户

jaxb.properties

要将MOXy指定为JAXB提供程序,您需要在与域模型相同的包中包含一个名为
JAXB.properties
的文件,其中包含以下条目(请参阅:)


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>
关于JSON需要注意的事项:

  • null
    值用于表示
    lastName
    为null。不存在
    xsi:nil
    属性
  • 电话号码集合的大小为1,并用方括号正确绑定。许多库错误地将大小为1的集合视为JSON对象
  • 类型为
    int
    属性
    已正确编组,不带引号
  • 在XML表示中,
    id
    是一个属性,但在JSON表示中,不需要特别表示它

演示代码

在下面的演示代码中,我们将把XML文档转换为对象,然后将这些相同的实例转换为JSON

演示

MOXy不仅仅解释JAXB注释,它是一个JAXB实现,因此使用标准的JAXB运行时API。JSON绑定是通过在
Marshaller
上指定MOXy-specify属性来启用的

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

}

看看根森图书馆

它易于使用,性能优良,设计时考虑了扩展性。 实际上,它进行json/java转换,但不进行xml转换。但是,在将来的版本中可能会添加xml支持

我在jersey的web应用程序和REST web服务中使用它,但在某些情况下,还可以将json形式的对象存储到数据库中


啊,而且它是在Apache2.0许可下的。

几乎有数百个。我最喜欢的是GSON for POJO JSON和castor xml for POJO xml


另外,两者都是根据Apache License 2.0样式的许可证进行许可的。

Xstream支持JSON的序列化:我尝试了Xstream,但发现JSONHierarchycalStreamDriver和JettisonMappedXmlDriver存在各种限制。1) 流驱动程序无法反序列化它只能序列化2)映射的xml驱动程序可以同时执行这两项操作,但无法生成漂亮的JSON如果符合上述约束条件,XSTREAM是一个不错的选择。Hy Darren您的挖掘(XMLJSON)成功了吗。我正在研究如何使用POJO来实现它,我需要处理未知的JSON元素,我正在处理向量,这是一项艰巨的工作,目前还没有解决方案。不幸的是,ChearsXMLJSON是一个非常有问题的问题,因为数据模型与我们可能假设的更为不同——基本上是因为XML在“对象”和“数组”之间没有区别,不像JSONDid,您成功地使用了这个类吗?我运行了一些测试,得到了一个无限循环。我需要用你的Pojo将一个通用的JSON解析成XML。实际上,我已经使用了XStream,它似乎工作得很好。另外,Jackson还可以使用XML,这是Jackson页面上的许可证信息链接-。据我所知,由于Jackson拥有GPL许可证,这就排除了Jack的使用
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
<?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>
{
   "firstName" : "Jane",
   "lastName" : null,
   "phone-number" : [ {
      "id" : 123,
      "value" : "555-1234"
   } ]
}
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);
    }

}