Jackson注解介绍
只是简单介绍。
/**
* @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;