我有一个对象图,我想在 JSON 和 XML 之间进行转换,以创建 REST 样式的 API。我觉得肯定有人已经这样做了,但是使用 Google 和 Stack Overflow 快速搜索什么也没有发现。
有谁知道合适的(Apache 或同等许可首选)库来执行此操作?
来自谷歌的GSON:http ://code.google.com/p/google-gson/ ,
或者
Jackson春季使用的库:https ://github.com/FasterXML/jackson
我同意其他人建议将 jaxb 用于 XML 到 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 section
注意: 我是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<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
输入.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
属性。property
of 类型int
被正确编组,不带引号。id
中是一个属性,但在 JSON 表示中,不需要专门表示它。演示代码
在下面的演示代码中,我们会将 XML 文档转换为对象,然后将这些相同的实例转换为 JSON。
演示
MOXy 不仅解释 JAXB 注释,它还是一个 JAXB 实现,因此使用标准 JAXB 运行时 API。JSON 绑定是通过在Marshaller
.
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。
有了它:带有 JAXB 的 Java<->POJO(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-xml-databind ”的扩展,它可以读/写 XML,类似于 JAXB。所以它可以用于 JSON 和 XML,来往/来自 POJO。
几乎有数百个。我最喜欢的是用于 POJO <-> JSON 的 GSON 和用于 POJO <-> XML 的 castor-xml。
作为奖励,两者都在 Apache License 2.0 样式许可下获得许可。
上次我在网站上看到,XStream 两者都可以。它支持 XML 和 JSON 作为序列化目标。
看看 Genson 库http://code.google.com/p/genson/wiki/GettingStarted。
它易于使用、性能卓越,并且在设计时考虑了扩展性。实际上它进行 json/java 转换但不是 xml。但是,将来的版本中可能会添加 xml 支持。
我在 web 应用程序和球衣的 REST web 服务中使用它,但在某些情况下也将对象以 json 形式存储到数据库中。
啊,它在 Apache 2.0 许可下。