从自定义反序列化器

时间:2015-12-25 05:18:56

标签: java jackson deserialization

如何从Jackson自定义解串器或转换器中访问@JacksonInject值?请提供完整的源代码:

  1. 配置ObjectMapper的入口点。
  2. 构造函数需要注入值的类。
  3. 上述类的自定义反序列化程序。
  4. 我看到了DeserializationContext.findInjectableValue(),但我不确定如何构建相应的BeanProperty

    我还看了@JsonDeserialize(converter = ...),但没有看到任何方法将注入的值传递给转换器。这支持了吗?

1 个答案:

答案 0 :(得分:1)

这是我的(未经测试的)答案:

public class JacksonDeserializer extends StdDeserializer<MyPojo>
    implements ContextualDeserializer
{
    private static final long serialVersionUID = 1L;
    /**
     * The JSON property being deserialized (null if root object).
     */
    private final BeanProperty property;

    JacksonDeserializer()
    {
        super(MyPojo.class);
        this.property = null;
    }

    /**
     * @param property the JSON property being deserialized (null if root object)
     */
    JacksonDeserializer(BeanProperty property)
    {
        super(MyPojo.class);
        this.property = property;
    }

    @Override
    public JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property)
        throws JsonMappingException
    {
        return new JacksonDeserializer(property);
    }

    @Override
    public MyPojo deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException
    {
        MyInjectable injectable = (MyInjectable) ctxt.findInjectableValue("myInjectable", property, null);
        assert (scope != null);
        // The rest of the deserializer goes here
    }
}

我希望这会有所帮助。