Jackson全面解析–注解讲解之(@JsonProperty,@JsonPropertyOrder)
@JsonProperty
@JsonProperty可以说是用的频率非常高的一个注解,如下
@AllArgsConstructor(staticName = "of") @NoArgsConstructor @Getter @Setter class JsonPropertyPojo{ private String sex; private String name; } 序列化代码如下 @Test public void JsonPropertyTest() throws Exception{ CombineJacksonAnnotation.JsonPropertyPojo pojo = CombineJacksonAnnotation.JsonPropertyPojo.of("男","小刘"); System.out.println(om.writeValueAsString(pojo)); } 序列化结果如下 { "sex" : "男", "name" : "小刘" }
比如说现在有个场景,我们需要将sex序列化成gender,如果说直接的修改代码,修改的地方肯定很多,我们可以使用@JsonProperty注解
在sex字段上面添加如下注解
@JsonProperty(value = "gender") private String sex; 序列化结果就变成了 { "name" : "小刘", "gender" : "男" }
我们还可以给序列化的字段指定序列化的顺序,序号越小,越靠前,如下
@AllArgsConstructor(staticName = "of") @NoArgsConstructor @Getter @Setter class JsonPropertyPojo{ @JsonProperty(value = "gender",index = 1) private String sex; @JsonProperty(value = "cname",index = 2) private String name; } 序列化结果如下 { "gender" : "男", "cname" : "小刘" }
在pojo有些特殊的属性,比如id属性,一般来说我们序列化的时候可以序列化掉,但是反序列化的时候我们希望忽略该字段,因为该id字段可能不安全,这样的id我们称为READ_ONLY的,相反的只用在反序列化,而序列化的时候不输出的字段我们称为WRITE_ONLY。还有些字段不管自否可见,都要可以序列化和反序列化,我们称为READ_WRITE。
@JsonProperty注解里面也提供了这样的access属性来标明此种场景,举例如下
@AllArgsConstructor(staticName = "of") @NoArgsConstructor @Getter @Setter class JsonPropertyPojo{ @JsonProperty(value = "gender",index = 1,access = JsonProperty.Access.READ_ONLY) private String sex; @JsonProperty(value = "cname",index = 2,access = JsonProperty.Access.WRITE_ONLY) private String name; } 序列化结果如下 { "gender" : "男" }
因为name是WRITE_ONLY的,所以不参与序列化过程。
反序列化代码如下
可以看到sex字段没有填充,因为此字段不参与反序列化
我们再看一个场景
@AllArgsConstructor(staticName = "of") @NoArgsConstructor class JsonPropertyPojo{ @Getter @Setter @JsonProperty(value = "gender",index = 1,access = JsonProperty.Access.READ_ONLY) private String sex; @Getter @Setter @JsonProperty(value = "cname",index = 2,access = JsonProperty.Access.WRITE_ONLY) private String name; private String unknown; } 序列化之后, { "gender" : "男" }
unknown没有被序列化出来,这是因为其不可见,我们可以修改成如下
@JsonProperty(access = JsonProperty.Access.READ_WRITE) private String unknown; 序列化结果如下 { "unknown" : "some", "gender" : "男" }
当然前面介绍的@JsonAutoDetect注解也可以实现这样的功能,但是推荐使用@JsonProperty提供的能力。
@JsonPropertyOrder @JsonPropertyOrder主要提供在类上的直接,指定序列化的顺序,如下 @AllArgsConstructor(staticName = "of") @NoArgsConstructor @JsonPropertyOrder({"unknown","cname","gender"}) class JsonPropertyPojo{ @Getter @Setter @JsonProperty(value = "gender") private String sex; @Getter @Setter @JsonProperty(value = "cname") private String name; @JsonProperty(access = JsonProperty.Access.READ_WRITE) private String unknown; }
我们直接的在类上执行了序列化的顺序,如果有字段没有指定,默然排在指定了顺序的字段之后,序列化结果如下
{ "unknown" : "some", "cname" : "小刘", "gender" : "男" }
当然@JsonPropertyOrder也提供了alphabetic 设置为ture的话,默认按照子单的字母顺序排序