Java Jackson自定义反序列化-can';不要读取JsonParser两次

Java Jackson自定义反序列化-can';不要读取JsonParser两次,java,json,serialization,Java,Json,Serialization,我正在尝试实现一个Jackson反序列化程序,以便在JSON发生变化时能够进行迁移(例如,像重命名的字段,在这里我需要将现在不一致的JSON读入一致的JSON) 一种方法是创建一个JsonDeserializer,将JSON作为正确的最终类读取,然后将其作为映射再次读取,以选择更改 但我似乎无法做到这一点,因为每次我读取或反序列化JSON时,支持流都会关闭 class CustomDeserializer extends StdDeserializer<MyPOJO> impleme

我正在尝试实现一个Jackson反序列化程序,以便在JSON发生变化时能够进行迁移(例如,像重命名的字段,在这里我需要将现在不一致的JSON读入一致的JSON)

一种方法是创建一个JsonDeserializer,将JSON作为正确的最终类读取,然后将其作为映射再次读取,以选择更改

但我似乎无法做到这一点,因为每次我读取或反序列化JSON时,支持流都会关闭

class CustomDeserializer extends StdDeserializer<MyPOJO> implements ResolvableDeserializer{

    private final JsonDeserializer<?> deserializer;
    private final ObjectMapper mapper;

    public CustomDeserializer(JsonDeserializer<?> deserializer, ObjectMapper mapper) {
        super(MyPOJO.class);
        this.deserializer = deserializer;
        this.mapper = mapper;
    }

    @Override
    public MyPOJO deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        MyPOJO deserialized = (MyPOJO) deserializer.deserialize(jp, ctxt);
        // Custom migration would go here...
        return deserialized;
    }

    @Override
    public void resolve(DeserializationContext ctxt) throws JsonMappingException {
        ((ResolvableDeserializer) deserializer).resolve(ctxt);
    }
}
类CustomDeserializer扩展StdDeserializer实现ResolvableDeserializer{
私有最终JsonDeserializer反序列化程序;
私有最终对象映射器映射器;
公共自定义反序列化程序(JsonDeserializer反序列化程序、ObjectMapper映射程序){
超级(MyPOJO.class);
this.deserializer=反序列化器;
this.mapper=mapper;
}
@凌驾
公共MyPOJO反序列化(JsonParser jp,DeserializationContext ctxt)抛出IOException,JsonProcessingException{
MyPOJO反序列化=(MyPOJO)反序列化器;
//自定义迁移将转到此处。。。
返回反序列化;
}
@凌驾
public void resolve(反序列化上下文ctxt)引发JsonMappingException{
((ResolvableDeserializer)反序列化器).resolve(ctxt);
}
}

我避免创建新的ObjectMapper,因为已经有一个自定义的ObjectMapper,例如带有自定义日期反序列化器,所以当我使用MyPOJO自定义反序列化器时,我希望能够以某种方式委托反序列化,以便它使用所有以前的配置。

这就是我想到的:

@Autowired
    public Serializer(List<IDeserializer> deserializers) {
        SimpleModule module = new SimpleModule("name");
        registerDeserializers(module, deserializers);
        mapper.registerModule(module);
        mapper.configure(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS, true);
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
    }

    private void registerDeserializers(SimpleModule module, List<IDeserializer> deserializers) {
        if (CollectionUtils.isNotEmpty(deserializers)) {
            final Map<Class<?>, IDeserializer> deserializerRegistryMap = toMap(deserializers);
            module.setDeserializerModifier(new BeanDeserializerModifier() {
                @Override
                public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
                    if (deserializerRegistryMap.containsKey(beanDesc.getBeanClass())){
                        return deserializerRegistryMap.get(beanDesc.getBeanClass()).getDeserializer(mapper);
                    }
                    return super.modifyDeserializer(config, beanDesc, deserializer);
                }
            });
        }
    }


@Component
public class MigrationDeserializer {

    @Autowired
    private MigratorRegistry migratorRegistry;

    public <T> JsonDeserializer<T> createDeserializer(final ObjectMapper mapper, final Class<T> returnType, final Class<? extends SerializedObjectsHistory<T>> historyType){
       return new StdDeserializer<T>(returnType){

           @Override
           public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
               SerializedObjectsHistory<T> history = mapper.readValue(p, historyType);
               return migratorRegistry.migrate(history, returnType);
           }
       };
    }
}
@Autowired
公共序列化程序(列表反序列化程序){
SimpleModule=新的SimpleModule(“名称”);
寄存器序列化器(模块、反序列化器);
映射器注册表模块(模块);
configure(反序列化功能。使用大小数表示浮点数,true);
setSerializationInclusion(JsonInclude.Include.NON_NULL);
setDateFormat(新的SimpleDateFormat(“yyyy-MM-dd”);
}
专用无效注册表项序列化程序(SimpleModule模块、列表反序列化程序){
if(CollectionUtils.isNotEmpty(反序列化程序)){
最终地图