只是简单介绍。

/**
 * @ClassName JacksonInfoTest
 * @Description jackson包相关方法
 * @Author LiuQian
 * @Date 2022-07-17
 **/
public class JacksonInfoTest {

    @Test
    public void test() throws JsonProcessingException {
        UserInfo u = new UserInfo("00001","123456","",new Date());
        ObjectMapper om = new ObjectMapper();
        System.out.println(om.writeValueAsString(u));
    }


    /**
     * @JsonValue 修饰在属性和方法上,表示只序列化单个字段或单个方法(无参、返回非void)的返回值,而不是收集对象的所有属性。
     *      一个类中最多只能有一个 @JsonValue 注解。
     */
    @Data
    class UserInfo {
        //@JsonProperty 指定字段别名
        @JsonProperty("id")
        private String userId;
        //@JsonIgnore 指定字段不返回
        @JsonIgnore
        @JsonSerialize(as = ToStringSerializer.class)
        private String password;
        //指定空字段不返回
        @JsonInclude(JsonInclude.Include.NON_EMPTY)
        private String phone;
        //@JsonFormat 指定日期格式
        @JsonFormat(pattern="yyyy-MM-dd",locale="zh",timezone="GMT+8")
        private Date createTime;

        /**
         * @JsonCreator 反序列化注解,只能用在静态方法和构造方法上.
         *    反序列化时,默认会执行无参构造方法,可以使用此注解指定要执行的构造方法,如果执行时没提供参数会报错.
         *     @JsonProperty("id")String id 指定参数字段
         *
         * @param userId
         * @param password
         * @param phone
         * @param createTime
         */
        @JsonCreator
        public UserInfo(String userId, String password, String phone, Date createTime) {
            this.userId = userId;
            this.password = password;
            this.phone = phone;
            this.createTime = createTime;
        }

    }
}
1 @JsonIgnoreType
  • 范围:序列化/反序列化

  • 作用:标注在类上,表示本类不参与序列化

@JsonIgnoreType
public class Dog {
    private String name;
}

public class Person {
    private String name;
    private Dog dog;
}
2 @JsonIgnore
  • 范围:序列化/反序列化

  • 作用:用来忽略某些字段,可以用在字段、方法上。这个注解一般用在我们要忽略的字段上,序列化/反序列化都有效

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
@JsonIgnoreType
public class Dog {
    @JsonIgnore
    private String name;
    private Integer age;
}

3 @JsonView

范围:序列化

作用:控制视图输出

用来指定哪些属性可以被包含在JSON视图中。@JsonIgnore和@JsonIgnoreProperties可以排除掉不需要序列化的属性,可是如果一个POJO中有上百个属性如订单类,此时若使用@JsonIgnore书写上就非常麻烦了,这时你就可以使用@JsonView。

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public static class TestPOJO {
    // 视图A
    @JsonView(FilterView.OutputA.class)
    private String a;
    private String c;
    // 视图B
    @JsonView(FilterView.OutputB.class)
    private String d;
    @JsonView(FilterView.OutputB.class)
    private String b;
}


// 控制视图输出
private interface FilterView {
    interface OutputA { }
    interface OutputB { }
}
@Getter
@Setter
@ToString
public static class TestPOJO {
    // 视图A
    @JsonView(FilterView.OutputA.class)
    private String a;
    private String c;
    // 视图B
    @JsonView(FilterView.OutputB.class)
    private String d;
    @JsonView(FilterView.OutputB.class)
    private String b;
}


// 控制视图输出
private interface FilterView {
    interface OutputA { }
    interface OutputB { }
}


@Test
public void fun3() throws Exception {
    JsonMapper jsonMapper = new JsonMapper();
    TestPOJO testPOJO = new TestPOJO();
    testPOJO.setA("1");
    testPOJO.setB("2");
    testPOJO.setC("3");
    testPOJO.setD("4");

    // jsonMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
    String jsonStr = jsonMapper.writerWithView(FilterView.OutputA.class).writeValueAsString(testPOJO);
    System.out.println("视图A:" + jsonStr);
    String jsonStr2 = jsonMapper.writerWithView(FilterView.OutputB.class).writeValueAsString(testPOJO);
    System.out.println("视图B:" + jsonStr2);
}

#视图A:{"a":"1","c":"3"}
#视图B:{"c":"3","d":"4","b":"2"}

4 @JsonProperty

范围:序列化和反序列化化

作用:定义属性别名和把属性公开

反序列化:把属性公开(反序列化时是根据setXX方法的名字进行反序列化赋值,除非属性是public的,所以@JsonProperty把属性公开)
序列化:把属性公开(序列化时是根据getXX方法的名字进行反序列化赋值,除非属性是public的,所以@JsonProperty可以把属性公开)

5 @JsonEnumDefaultValue

标注在enum里面的值上作为反序列化时默认值。

该注解仅在开启了DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE才有效
而默认是没有开启的,生产环境建议可以开启。

public enum MyEnum {
    @JsonEnumDefaultValue
    NAME,
    SSS;
}
6 @JsonRawValue
  • 范围:序列化

  • 作用:按原样序列化属性。该值不转义或引用。这在已经JSON中序列化的值或已引用值的情况下很有用

@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@ToString
public class Person {
    @JsonRawValue
    private String name;

}
7 @JsonUnwrapped
  • 范围:序列化

  • 作用:简单的说就是把你具有层级结构的JSON数据给解包打平了,它还可以指定前缀后缀

@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@ToString
public class Person {

    private String name;

    @JsonUnwrapped(prefix = "dog_")
    private Dog dog;
}

JsonMapper jsonMapper = new JsonMapper();
Dog dog = new Dog("小灰狗");
Person person = new Person("张三",dog);
System.out.println( jsonMapper.writeValueAsString(person));

#输出:{"name":"张三","dog":{"name":"小灰狗"}}
#加上注解输出:{"name":"张三","dog_name":"小灰狗"}
8 @JsonValue
  • 范围:序列化

  • 作用:它能标注在get方法或者字段上,一个类只能用一个。当加上@JsonValue注解时,序列化时就只返回这一个字段的值(直接返回值,而不是json格式了)

public class Dog {
    @JsonValue
    private String name;
    private Integer age;
}
9 @JsonFormat
  • 范围:序列化和反序列化格式

// 它可以标注在几乎任何地方(用得最多的是标注在字段上)}) 
public @interface JsonFormat {
    // 指定格式模版。 -> 该模版由具体的序列化器去实现
    public String pattern() default "";
    // 序列化后的类型
    // ANY:并不指定特定的类型(注意和NATURAL的区别)
    // NATURAL:JSON->String  JSON Number -> Java Numbers等等
    // SCALAR:不应该是结构化的数组、对象等。但可以是其它任何类型
    // ARRAY:数组
    // OBJECT:对象
    // NUMBER:数字
    // ... // 省略其它类型如int、string等等
    public Shape shape() default Shape.ANY;
    // 默认值是java.util.Locale#getDefault()
    public String locale() default DEFAULT_LOCALE;
    // 默认时区:GMT  (在中国:如果你格式化的是时间这个必须设置为timezone = "GMT+8",注意timezone = "UTC+8"是不好使的)
    // 当然一般建议通过ObjectMapper进行全局设置
    public String timezone() default DEFAULT_TIMEZONE;

    // 可以单独为这个字段开启or关闭某项特征。比如WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS等等特征
    public JsonFormat.Feature[] with() default { };
    public JsonFormat.Feature[] without() default { };
}
public class Dog {
    private String name;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date date;
}
10 @JsonSerialize / @JsonDeserialize

这两个注解是开发中经常用到的:为某个类、Filed等指定使用专用的序列化器/反序列化器(一般在自定义序列化器时用得多)。形如这样:

@JsonDeserialize(using= DateJsonDeserializer.class)
@JsonSerialize(using= DateJsonSerializer.class)
private Date time;

文章作者: 刘同学
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 刘同学的小站
后端 Jackson Json
喜欢就支持一下吧