如何配置Jackson ObjectMapper以不使用自定义Json Serializer
解决方法:让指定ObjectMapper不使用自定义序列化器
根据JsonCustomSerializer的注册方式,分以下几种场景处理:
场景1:序列化器通过Module注册
如果你的自定义序列化器是通过SimpleModule注册到ObjectMapper的(示例代码如下):
SimpleModule customModule = new SimpleModule(); customModule.addSerializer(CustomObject.class, new JsonCustomSerializer()); // 该实例使用自定义序列化器 ObjectMapper mapperWithSerializer = new ObjectMapper().registerModule(customModule);
要创建不使用该序列化器的ObjectMapper,直接生成独立的新实例,不注册这个Module即可:
// 此实例不会触发JsonCustomSerializer的逻辑 ObjectMapper mapperWithoutSerializer = new ObjectMapper();
两个ObjectMapper实例完全独立,各自的配置互不干扰,需要使用序列化器的实例保留原注册逻辑即可。
场景2:序列化器通过类注解指定(@JsonSerialize)
如果CustomObject类上直接标注了@JsonSerialize(using = JsonCustomSerializer.class):
@JsonSerialize(using = JsonCustomSerializer.class) public class CustomObject { // 类成员定义 }
有两种方案可以让指定ObjectMapper忽略这个注解:
方案A:全局禁用Jackson注解
通过关闭MapperFeature.USE_ANNOTATIONS,让ObjectMapper忽略所有Jackson注解(包括@JsonSerialize):
ObjectMapper mapperWithoutSerializer = new ObjectMapper(); mapperWithoutSerializer.disable(MapperFeature.USE_ANNOTATIONS);
注意:此配置会忽略所有Jackson注解(如@JsonProperty、@JsonIgnore等),适合不需要依赖任何注解的场景。
方案B:用MixIn精准覆盖注解
创建一个空的MixIn类,不指定序列化器,再将其绑定到CustomObject上,以此覆盖原类的@JsonSerialize注解:
// 空的MixIn类,无序列化器配置 abstract class CustomObjectMixIn {} ObjectMapper mapperWithoutSerializer = new ObjectMapper(); // 绑定MixIn,覆盖CustomObject的序列化注解 mapperWithoutSerializer.addMixIn(CustomObject.class, CustomObjectMixIn.class);
这种方式只会修改CustomObject的序列化规则,不会影响其他类的注解逻辑,更精准。
场景3:直接在ObjectMapper上添加序列化器
如果是通过addSerializer方法直接给ObjectMapper添加序列化器:
ObjectMapper mapperWithSerializer = new ObjectMapper(); mapperWithSerializer.addSerializer(CustomObject.class, new JsonCustomSerializer());
同样,创建新的ObjectMapper实例,不执行addSerializer操作即可:
ObjectMapper mapperWithoutSerializer = new ObjectMapper();
内容的提问来源于stack exchange,提问作者user762421
相关产品推荐
相关产品推荐

