基于用户定义值的自定义序列化

时间:2014-06-27 11:21:26

标签: java json serialization jackson fasterxml

我有一个 pojo

@JsonIgnoreProperties(ignoreUnknown = true)
public class Item
{
   String name;

   Long baseId;

   @JsonIgnore
   String status;
}

我将此Java对象用于 GET POST PUT api调用。我已经使用了 @JsonIgnore 注释来避免序列化(因此它不会为 PUT POST 请求进行序列化,但我得到 GET 请求)。现在我需要将baseId序列化为 POST 请求,而不是 PUT 请求。请建议我解决方案。

1 个答案:

答案 0 :(得分:0)

您可以考虑使用the Jackson Json views。基本上,您使用视图类型替换Jackson视图注释上的@JsonIgnore注释,并根据上下文启用它。以下是普通对象映射器的示例:

public class JacksonView {

    public static interface View1 {
    }

    public static interface View2 {
    }

    public static class Bean {
        @JsonView(View1.class)
        public final String field1;
        @JsonView(View2.class)
        public final String field2;
        public final String field3;

        public Bean(String field1, String field2, String field3) {
            this.field1 = field1;
            this.field2 = field2;
            this.field3 = field3;
        }
    }
    public static void main(String[] args) throws JsonProcessingException {
        Bean bean = new Bean("a", "b", "c");
        ObjectMapper mapper = new ObjectMapper();
        System.out.println(mapper
                .writer()
                .withView(View2.class)
                .writeValueAsString(bean));

    }

}

输出:

{"field2":"b","field3":"c"}

要使其在JAX-RS中工作,您应该通过按照here所述注释HTTP方法资源来启用特定视图。例如:

@GET
@JsonView(View1.class)
public Bean doGet() {...}

@POST
@JsonView(View2.class)
public void doPost(Bean bean) {...}