如何从Jackson反序列化时获取转换为的类型

时间:2015-06-05 11:41:22

标签: java json jackson jodatime

通过委托给Joda Convert来一般序列化任何类型(例如Joda DateTime)是微不足道的:

public class ToJodaConverter extends SerializerBase<Object> {
    protected ToJodaConverter() {
        super(Object.class);
    }

    @Override
    public void serialize(Object value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        gen.writeString(StringConvert.INSTANCE.convertToString(value));
    }
}

我想以同样的方式反序列化,如下所示:

public class FromJodaConverter extends StdDeserializer<Object> {
    protected FromJodaConverter() {
        super(Object.class);
    }

    @Override
    public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        return StringConvert.INSTANCE.convertFromString(TYPE, jp.getText());
    }
}

但是如何获得应转换为的TYPE?我一直在搜索JsonDeserializer的其他子类,但无法找到如何执行此操作,或者如何使用type参数实现其他deserialize方法。

1 个答案:

答案 0 :(得分:3)

您需要指定要反序列化的类型:

public class FromJodaConverter<T> extends StdDeserializer<T> {
    public FromJodaConverter(Class<T> clazz) {
        super(clazz);
    }

    @Override
    public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
        return StringConvert.INSTANCE.convertFromString(handledType(), jp.getText());
    }
}

因此,要创建一个反序列化Foo实例的FromJodaConverter,你可以使用

new FromJodaConverter(Foo.class);

要创建一个反序列化Baz实例的FromJodaConverter,你可以使用

new FromJodaConverter(Baz.class);