Jackson全面解析–注解讲解之(@JsonProperty,@JsonPropertyOrder)

作者: adm 分类: java 发布时间: 2022-06-09 08:55

@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的话,默认按照子单的字母顺序排序

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!