- Jackson全面解析--注解全讲解十一(@JsonProper
- Jackson全面解析--注解全讲解八(@JsonIgnore,
- Jackson全面解析--注解全讲解七(@JsonGetter
- Jackson全面解析--注解全讲解二(@JsonAnyGett
- Jackson全面解析--注解全讲解一(@JacksonAnno
- Jackson全面解析--注解全讲解四(@JsonCreator
- Jackson全面解析--注解全讲解五(使用@JsonFilte
- Jackson全面解析--注解全讲解十二(动态添加字段@Json
- Jackson全面解析--注解全讲解九(过滤无用信息@JsonI
- Jackson全面解析--注解全讲解三(循环依赖杀手锏 @Jso
@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的话,默认按照子单的字母顺序排序
网友评论