簡體   English   中英

使用Jackson進行自定義反序列化:擴展默認反序列化器

[英]Custom deserialization with Jackson: extend default deserializer

我想通過擴展默認值使其在其后設置更多值來制作自己的解串器:

simplified code:
public class Dto {
    public String originalJsonString;
}

public MyFooDto extends Dto {
    public String myField;
}



@Bean
public ObjectMapper deserializingObjectMapper() {
    ObjectMapper objectMapper = new ObjectMapper();
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addDeserializer(MyFooDto.class, new JsonDtoDeserializer<>());
    objectMapper.registerModule(javaTimeModule);
    return objectMapper;
}
// or maybe instead of the Beam just @JsonDeserialize(using = JsonDtoDeserializer.class) before MyFooDto?


public class JsonDtoDeserializer<T extends Dto> extends StdDeserializer<T> {
// or maybe extends JsonDeserializer? or UntypedObjectDeserializer? or UntypedObjectDeserializer.Vanilla?

    public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
        // here I would like:
        T item = super.deserialize"AsUsual"(p, ctxt);
        // the difficulty is to avoid the loop of death, where the deserializer would call itself for the eternity...

        // And then set other Dto-fields depending on the original Json input, for example:
        item.originalJsonString = p.readValueAsTree().toString();
        return item;
    }
}

如您所見,我還想將此Dto母類重用於其他DTO。

  • 我沒有找到任何例子。 我真的是世界上第一個嗎?
  • 反序列化“通常”(p,ctxt)應該是什么?
  • 我應該使用什么班級? JsonDeserializer / StdDeserializer / UntypedObjectDeserializer?
  • 解串器是否知道必須實例化T的類​​?

謝謝社區!

正如沙龍所說(基於我如何從傑克遜的自定義解串器中調用默認解串器

@Bean
public ObjectMapper serializingObjectMapper() {

    ObjectMapper objectMapper = new ObjectMapper();
    SimpleModule simpleModule = new SimpleModule();

    simpleModule.setDeserializerModifier(new BeanDeserializerModifier() {
        @Override
        public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
            if (Dto.class.isAssignableFrom(beanDesc.getBeanClass())) {
                return new JsonDtoDeserializer<>(deserializer, beanDesc.getBeanClass());
            }
            return deserializer;
        }
    });

    objectMapper.registerModule(simpleModule);
    return objectMapper;
}



public class JsonDtoDeserializer<T extends Dto> extends StdDeserializer<T> implements ResolvableDeserializer /*StdDeserializer<Dto<T>>*/ /*UntypedObjectDeserializer.Vanilla*/ /*<T>*/ /*implements ResolvableDeserializer*/ {

    private final JsonDeserializer<?> defaultDeserializer;

    public JsonDtoDeserializer(JsonDeserializer<?> defaultDeserializer, Class<?> clazz) {
        super(clazz);
        this.defaultDeserializer = defaultDeserializer;
    }

    @Override
    public T deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException {

        @SuppressWarnings("unchecked")
        T itemObj = (T) defaultDeserializer.deserialize(p, ctxt);
        return itemObj;
    }

    // for some reason you have to implement ResolvableDeserializer when modifying BeanDeserializer
    // otherwise deserializing throws JsonMappingException??
    @Override public void resolve(DeserializationContext ctxt) throws JsonMappingException
    {
        ((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM