是否有一个库可以将Java POJO转换为JSON和XML?

为了创建REST风格的API,我有一个对象图,我想要转换为JSON和XML。 令我感到震惊的是,某人必须已经这样做了,但是使用Google和Stack Overflow进行的快速搜索没有任何结果。

有没有人知道一个合适的(Apache或等效的许可首选)库来做到这一点?

来自谷歌的GSON : http : //code.google.com/p/google-gson/ ,

要么

jackson在spring使用的库: https : //github.com/FasterXML/jackson

我同意其他人建议jaxb for XML to pojo,很好地支持很多工具:它的标准。

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

对于JSON,我什么都不知道,但是如果你想实现一个RESTful API,你可能会对JSR-311感兴趣,它为RESTful API和Jersey定义了服务器端API,这是它的参考实现。

使用Xstream http://x-stream.github.io/表示xml,使用JSON http://www.json.org/java/表示JSON。 我不认为有一个库可以做到这两个。

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

我想你可能正在寻找类似于这里的东西: JSON.org Java部分

注意:我是EclipseLink JAXB(MOXy)的负责人,也是JAXB(JSR-222)专家组的成员。

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

许可证信息


域模型

以下是我们将用于此示例的域模型。 对于这个例子,我只使用自Java SE 6以来JDK / JRE中提供的标准JAXB(JSR-222)注释。

顾客

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 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。

   Jane  555-1234  

有关XML的注意事项:

  • xsi:nil属性用于指示lastName为null。
  • 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为null。 不存在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); } } 

Json-lib根据Apache 2.0许可证授权。

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

我个人会分别处理这两个问题; 并通过JSON < - > Pojo < - > XML转换JSON < - > XML。

有了这个:Java < - > POJO与JAXB( http://jaxb.dev.java.net ;也与JDK 1.6捆绑在一起)带注释(XStream也可以); 对于JSON,jackson的ObjectMapper( http://jackson.codehaus.org/Tutorial )。 与泽西很好地配合,我自己使用它(当前的泽西版本默认不包含完整的Pojo数据绑定,但在不久的将来)

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

编辑(2011年7月18日):jackson实际上有一个名为“ jackson-xml-databind ”的扩展,可以读/写XML,类似于JAXB。 因此,它可以用于JSON和XML,来自POJO。

最后我在网站上看到,XStream将同时做到这两点。 它支持XML和JSON作为序列化目标。

几乎有几百个。 我最喜欢的是GSON for POJO < - > JSON和castor-xml for POJO < - > XML。

作为奖励,两者都根据Apache License 2.0样式许可进行许可。

看看Genson图书馆http://code.google.com/p/genson/wiki/GettingStarted 。

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

我在网络应用程序和jersey中的REST Web服务中使用它,但在某些情况下也将它们以jsonforms存储到数据库中。

啊,这是在Apache 2.0许可下。