30

我有一个对象图,我想在 JSON 和 XML 之间进行转换,以创建 REST 样式的 API。我觉得肯定有人已经这样做了,但是使用 Google 和 Stack Overflow 快速搜索什么也没有发现。

有谁知道合适的(Apache 或同等许可首选)库来执行此操作?

4

10 回答 10

14

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

或者

Jackson春季使用的库:https ://github.com/FasterXML/jackson

我同意其他人建议将 jaxb 用于 XML 到 pojo,很好地支持很多工具:它是标准。

于 2011-08-15T21:01:52.623 回答
11

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

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

于 2009-03-18T16:31:09.417 回答
6

使用 Xstream http://x-stream.github.io/用于 xml 和 JSON http://www.json.org/java/用于 JSON。我认为没有一个图书馆可以两者兼得。

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

于 2009-03-18T16:33:27.243 回答
3

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

于 2009-03-18T16:23:19.593 回答
3

注意: 我是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属性。
  • 电话号码集合的大小为 1,并由方括号正确绑定。许多库错误地将大小为 1 的集合视为 JSON 对象。
  • propertyof 类型int被正确编组,不带引号。
  • 在 XML 表示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);
    }

}
于 2012-08-24T10:38:46.167 回答
1

Json-lib在 Apache 2.0 许可下获得许可。

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

于 2009-03-18T16:32:13.893 回答
1

就我个人而言,我会分别处理这两个问题;并通过 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。

于 2009-03-18T16:50:11.370 回答
0

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

作为奖励,两者都在 Apache License 2.0 样式许可下获得许可。

于 2014-05-09T14:03:12.073 回答
0

上次我在网站上看到,XStream 两者都可以。它支持 XML 和 JSON 作为序列化目标。

于 2009-03-18T20:12:27.640 回答
-1

看看 Genson 库http://code.google.com/p/genson/wiki/GettingStarted

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

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

啊,它在 Apache 2.0 许可下。

于 2012-08-24T13:00:26.360 回答