如何使用JAXB或Jackson有条件地序列化?外部视图与内部视图

时间:2012-10-17 18:58:37

标签: java xml json jaxb jackson

我正在构建一个RESTful API,我有一个用例,我需要能够呈现两个不同的数据视图。我们可以在内部使用的一个,以及我们将在外部公开的一个。此外,我的API需要同时支持XML和JSON。

对于我的JSON响应,这对Jackson非常容易。我可以通过使用JsonViews的功能有条件地在我的JSON响应中包含字段:http://wiki.fasterxml.com/JacksonJsonViews

首先,您需要创建一个指定视图的简单类:

public class Views {

    public static class External {}

    public static class Internal extends External {}
}

现在使用我的视图类,我只是注释我的字段,它们属于哪个视图:

    @JsonView(Views.External.class)
    private String external = "External";

    @JsonView(Views.Internal.class)
    private String internal = "Internal";

然后,您可以序列化对象并指定要使用的视图:

    ObjectMapper jsonMapper = new ObjectMapper();
    ObjectWriter externalWriter = jsonMapper.writerWithView(Views.External.class);
    String externalJson = externalWriter.writeValueAsString(new ResponseObject());

这适用于JSON,但不幸的是,目前不支持XML。我如何用XML实现相同的目标?如果有必要,我愿意使用JAXB进行XML转换。

2 个答案:

答案 0 :(得分:2)

我能够通过添加新库来覆盖默认值来实现这一点:

        <!-- Used to Convert our objects to JSON and XML -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.0.6</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-xml</artifactId>
            <version>2.0.5</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml</groupId>
            <artifactId>aalto-xml</artifactId>
            <version>0.9.8</version>
        </dependency>

所以现在我可以使用Jackson及其@JsonView功能序列化为JSON XML。很干净!我添加的是aalto-xml。

答案 1 :(得分:0)

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

EclipseLink JAXB(MOXy)提供外部映射文件。此映射文件可以扩充或完全替换通过注释提供的元数据。下面是一个示例,其中相同的对象模型映射到两个不同的天气服务(谷歌和雅虎)

MOXy还支持XML和JSON绑定:

MOXy还可以轻松地与JAX-RS实现集成: