是否有一个库可以将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许可下。