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匹配不到的问题,但这部分较为复杂,这里留个记录,后面我再看看。

posted on 2025-03-21 11:15  小小码0-0  阅读(41)  评论(0)    收藏  举报