- 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的,所以不参与序列化过程。
反序列化代码如下
 image.png
image.png
可以看到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的话,默认按照子单的字母顺序排序













网友评论