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

Java 如何使用JAXB或Jackson有条件地序列化?外部视图与内部视图,java,xml,json,jaxb,jackson,Java,Xml,Json,Jaxb,Jackson,我正在构建一个RESTful API,我有一个用例,需要能够呈现数据的两个不同视图。一个是我们可以在内部使用的,一个是我们将在外部公开的。此外,我的API需要同时支持XML和JSON 对于我的JSON响应来说,这对于Jackson来说非常容易。我可以使用JsonViews的功能在JSON响应中有条件地包含字段: 首先,您需要创建一个指定视图的简单类: public class Views { public static class External {} public sta

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

对于我的JSON响应来说,这对于Jackson来说非常容易。我可以使用JsonViews的功能在JSON响应中有条件地包含字段:

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

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转换。

注意:我是该专家组的负责人和成员

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

MOXy还支持XML和JSON绑定:

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


我可以通过添加一个新库来覆盖默认值来实现这一点:

        <!-- 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>

com.fasterxml.jackson.core
杰克逊数据绑定
2.0.6
com.fasterxml.jackson.dataformat
jackson数据格式xml
2.0.5
com.fasterxml
aalto xml
0.9.8

现在我可以使用Jackson及其@JsonView功能序列化为JSONXML。非常干净!我添加的是aalto xml。

谢谢您提供的信息!但我必须诚实地说,我真的不喜欢除了POJO之外还要管理XML文件来应用“视图”的想法。从这个角度来看,杰克逊对这一功能的支持非常优雅。话虽如此,在我所有的研究中,我还没有找到比您建议的更好的解决方案。为了完整起见,我还将提到Woodstox()是另一个运行良好的Stax impl——唉,JDK捆绑的SJSXP存在一些XML模块无法解决的问题(特别是在添加缩进时),我也应该提到这个。