JackSon的反序列化遇到的问题
@Override
public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String value = p.getValueAsString();
if (value != null && this.lovCode != null) {
String mappedValue = LovDataSource.getValue(this.lovCode, value);
return mappedValue;
}
return value; // 无注解时返回原值
}
@Override
public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) {
if (property != null) {
LovMapping lovMapping = property.getAnnotation(LovMapping.class);
if (lovMapping != null) {
// 创建新的反序列化器实例
LovMappingDeserializer lovMappingDeserializer = new LovMappingDeserializer(lovMapping.lovCode());
return lovMappingDeserializer;
}
}
return this; // 没有注解则返回当前实例
}
这里我要实现的功能是,在反序列化时,将我标注了注解的字段进行一些特殊转换。
序列化时没有发现问题,我就按照序列化的写法,同样写了一个自定义反序列化器,但是注解一直不能生效。通过debug发现,createContextual发现我的注解后,创建了新的实例,但是在deserialize时看其行为并未找到该字段对应的反序列化器,而是获取不到,又创建了一个新的反序列化器;
@JsonCreator
public SourceUnitDTO(
//响应字段
@JsonProperty("CODE") String unitCode,
@JsonProperty("orgName") String unitName,
@JsonProperty("PARENTCODE") String parentUnitCode,
@JsonProperty("dataStatus") String dataStatus
) {
this.unitCode = unitCode;
this.unitName = unitName;
this.parentUnitCode = parentUnitCode;
this.dataStatus = dataStatus;
}
随后我在类型中添加了@JsonCreator SourceUnitDTO 然后反序列化,发现已经能正常获取对应的反序列化实例,而不是自动创建的,本想查找之前未注解时,字段和Deserializer匹配不到的问题,但这部分较为复杂,这里留个记录,后面我再看看。
浙公网安备 33010602011771号