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));
		}
		
	}
相关推荐
海兰11 分钟前
【第28篇】可观测性实战:LangFuse 方案详解
人工智能·spring boot·alibaba·spring ai
jinanwuhuaguo1 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
RuoyiOffice1 小时前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
spring boot·后端·vue·anti-design-vue·ruoyioffice·假期·人力
xmjd msup1 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
952362 小时前
SpringBoot统一功能处理
java·spring boot·后端
Lyyaoo.2 小时前
优惠券秒杀业务分析
java·开发语言
消失的旧时光-19432 小时前
统一并发模型:线程、Reactor、协程本质是一件事(从线程到协程 · 第6篇·终章)
java·python·算法
勿忘初心12212 小时前
Java 国密 SM4 加密工具类实战(Hutool + BouncyCastle)|企业级数据加密 + 兼容 JDK8
java·数据安全·数据加密·后端开发·企业级开发·国密 sm4
庞轩px2 小时前
第8篇:原子类与CAS底层原理——无锁并发的实现
java·cas·乐观锁·aba·无锁编程·自旋
rleS IONS2 小时前
SpringBoot中自定义Starter
java·spring boot·后端