jackson相关注解

@JsonIgnoreProperties

@JsonIgnoreProperties(value = { "prop1","prop2" })用来修饰Pojo类, 在序列化和反序列化的时候忽略指定的属性, 可以忽略一个或多个属性.

@JsonIgnoreProperties(ignoreUnknown = true)用来修饰Pojo类, 在反序列化的时候忽略那些无法被设置的属性, 包括无法在构造子设置和没有对应的setter方法.

@JsonInclude

@JsonInclude注解的作用是指定实体类在序列化时的策略,在实体类序列化成json的时候在某些策略下,加了该注解的字段不去序列化该字段。例如,返回前端的实体类中如果某个字段为空的话那么就不返回这个字段了。

参数主要有:

  • ALWAYS:表示总是序列化所有属性
  • NON_NULL:表示序列化非null属性
  • NON_ABSENT:表示序列化非null或者引用类型缺省值,例如java8的Optional类,这个选中通常与Optional一起使用
  • NON_EMPTY:表示序列化非Empty的属性,例如空的集合不会被序列化
  • NON_DEFAULT:仅包含与POJO属性默认值不同的值
  • CUSTOM:由{@link JsonInclude#valueFilter}指定值本身,或由{@link JsonInclude#contentFilter}指定结构化类型的内容,由过滤器对象的equals方法进行序列化,返回true则会被排除,返回false会被序列化
  • USE_DEFAULTS:使用默认值
@JsonFormat

@JsonFormat可以完成格式转换。例如对于Date类型字段,如果不适用JsonFormat默认在rest返回的是long,如果使用@JsonFormat(timezone = "GMT+8", pattern = "yyyy/MM/dd HH:mm:ss"),就返回"2020/07/29 09:58:15"

@JsonIgnore

@JsonIgnore注解用来忽略某些字段,可以用在变量或者Getter方法上,用在Setter方法时,和变量效果一样。这个注解一般用在要忽略的字段上。用在属性和方法上,效果是一样的,都会屏蔽掉get、set方法 。这个注解只能用在POJO存在的字段要忽略的情况,不能满足现在需要的情况。

@JsonProperty

如果 json field 的名称和Pojo 的属性名不一致的时, 可以用 @JsonProperty 来注解 getter() 或 setter() 方法, 该注解设定json 对应的属性名, 另外@JsonProperty也经常用来注解构造子的形参, 这时候构造子应该加@JsonCreator 注解.

@JsonCreator

如果 Pojo 类定义有参数的构造子, 但没有提供无参构造子时, 在反序列化时是会报错. 有下面两个办法:

  1. 增加一个无参构造子
  2. 为这个有参数的构造子, 加上 @JsonCreator 注解, 同时参数需要加上 @JsonProperty 注解.
@JsonSetter 和 @JsonGetter

如果 json field 的名称和Pojo 的属性名不一致的时, 可以使用@JsonGetter来注解 getter(), 使用 @JsonSetter 来注解setter() 方法. 这两个注解都可以指定一个属性名. 这两个注解都可以用 @JsonProperty 替换.

@JsonAnySetter

一般对象属性名都是确定的, 比如 Person这个对象, 有 name/age等具名属性, 但有时候我们还需要为Person这个对象设定一些扩展属性, 这些扩展属性名称暂时不好确定, 通常使用 Map<String, String> 来存放这些扩展属性的K/V. 要把json 数据中的这些属性反序列化到类的Map中, 需要在类上增加一个K/V的setter方法, 而且这个setter方法要加上@JsonAnySetter注解.

java 复制代码
public class Person {
    public String name;
    private Integer age;
    private Map<String, String> properties;
 
    @JsonAnySetter
    public void add(String key, String value) {
        properties.put(key, value);
    }
}
@JsonAnyGetter

和@JsonAnySetter 注解相对应, 如果要将类中的Map K/V属性序列化到json中, 需要在类上增加一个 @JsonAnyGetter 方法, 该方法直接返回KV map就行.

java 复制代码
public class Person {
    public String name;
    private Integer age;
    private Map<String, String> properties;
 
    @JsonAnyGetter
    public void add(String key, String value) {
        properties.put(key, value);
    }
}
@JsonSerialize 和 @JsonDeserialize

@JsonSerialize注解可以为类属性设定专门的序列化函数, @JsonDeserialize注解用来为json属性定制化反序列化函数。比如,对于一些敏感性的数据如手机号,姓名等。我们需要做加密传输。

SpringMVC默认的JSON框架为jackson,也可以使用fastjson。

jackson框架的自定义序列化:

  1. 自定义的属性json化需要自定义JsonSerializer的实现类.如:
java 复制代码
public class EncryptSerializer extends JsonSerializer<String> {

	@Override
	public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
        //数据加密
		jsonGenerator.writeString(RSAUtils.encryptByPriKey(value));
	}
}
  1. jackson的反序列化:
java 复制代码
/**
 * 自定义序列化
 **/
public class DecryptDeserializer extends JsonDeserializer<String> {
​
    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
       retrun RSAUtils.decrypt(jp.getText());
    }
}

如果使用的是fastjson。则需要使用ObjectSerializer和ObjectDeserializer

fastjson使用的是 @JSONField类参数化数据

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>fastjson</artifactId>

</dependency>

java 复制代码
    class RSADeserializer implements ObjectDeserializer,ObjectSerializer{
 
		/*@Override
		public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
			String val = (String) parser.parse();
			return (String)RSAUtils.decrypt(val);
		}*/

        public String deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
			String val = (String) parser.parse();
			return RSAUtils.decrypt(val);
		}
 
		@Override
		public int getFastMatchToken() {
			// TODO Auto-generated method stub
			return 0;
		}
 
		@Override
		public void write(JSONSerializer serializer, Object object,Object fieldName, Type fieldType, int features)
				throws IOException {
			serializer.write(RSAUtils.encrypt(object));
		}
		
	}
相关推荐
希忘auto24 分钟前
Java之线程篇四
java
蓝黑202035 分钟前
Java知识点小结3:内存回收
java·gc
Yz98761 小时前
Hadoop里面MapReduce的序列化与Java序列化比较
java·大数据·jvm·hadoop·分布式·mapreduce·big data
凯哥Java1 小时前
优化批处理流程:自定义BatchProcessorUtils的设计与应用
java·数据库·mysql
njnu@liyong1 小时前
AOP-前置原理-怎么判断和拦截?
java·aop·拦截
末央&1 小时前
【C++】内存管理
java·开发语言·c++
心之语歌1 小时前
设计模式 享元模式(Flyweight Pattern)
java·设计模式·享元模式
MTingle1 小时前
【Java EE】文件IO
java·java-ee
coffee_baby1 小时前
享元模式详解:解锁高效资源管理的终极武器
java·spring boot·mybatis·享元模式
爱学习的真真子2 小时前
菜鸟也能轻松上手的Java环境配置方法
java·开发语言