如何在Jackson中用带上下文的重载方法反序列化JSON空值与Null值
解决Jackson自定义反序列化器处理Null/空值的非弃用方案
你提到的弃用方法对应的重载变体,是带DeserializationContext参数的getNullValue和getEmptyValue方法。Jackson 2.6+要求用这两个方法替代无参版本,用来处理null和空值的反序列化逻辑。
修改后的自定义反序列化器代码
package com.custom_app.client_app.web.business.dictionary.control.deserializer; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import io.vavr.control.Try; import java.io.IOException; public class CustomDeserializer extends StdDeserializer<String> { public CustomDeserializer() { super(String.class); } // 处理null值的非弃用方法 @Override public String getNullValue(DeserializationContext ctxt) { return "FILL_FIELD"; } // 处理空值(如空字符串"")的非弃用方法 @Override public String getEmptyValue(DeserializationContext ctxt) { return "FILL_FIELD"; } @Override public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { // 此时输入已排除null和空字符串,只需验证格式 return Try.of(p::getText) .filter(text -> text.matches("\\d{9}")) // 匹配9位数字 .getOrElse("FILL_FIELD"); // 格式不合法时返回默认值 } }
关键说明
getNullValue(DeserializationContext ctxt):当Jackson反序列化遇到null值时,会自动调用此方法,直接返回你定义的默认值。getEmptyValue(DeserializationContext ctxt):当输入是空字符串("")时,Jackson会调用此方法处理。deserialize方法优化:由于null和空值已被上述两个方法处理,这里只需专注验证非空输入的格式是否符合9位数字要求,不符合则返回默认值。
这样修改后,就能覆盖null、空字符串、格式不合法这三种场景,全部返回"FILL_FIELD",同时完全使用非弃用的Jackson API。
内容的提问来源于stack exchange,提问作者arServ
相关产品推荐
相关产品推荐

