是否有一个库可以将JavaPOJO与JSON和XML进行转换?
为了创建一个REST风格的API,我有一个对象图,我想在JSON和XML之间进行转换。我突然想到,一定有人已经这么做了,但使用Google和Stack Overflow进行快速搜索,什么也没发现是否有一个库可以将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
有人知道有合适的(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
为null。不存在lastName
属性xsi:nil
- 电话号码集合的大小为1,并用方括号正确绑定。许多库错误地将大小为1的集合视为JSON对象
- 类型为
的int
已正确编组,不带引号属性
- 在XML表示中,
是一个属性,但在JSON表示中,不需要特别表示它id
演示代码 在下面的演示代码中,我们将把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);
}
}