Jackson在发送到反序列化之前预处理json

r6l8ljro  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(160)

我有一个JSON字符串,我想使用ObjectMapper.readValue方法将其转换为POJO。
问题是输入的Json字符串包含我想在反序列化之前过滤掉的键。
我遇到了DelegatingDeserialization类,根据我的理解,它允许您扩展它并覆盖deserialize方法之一,以重构json输入,然后在链上传递它。
问题是,我试图通过在Pojo上添加@JsonDeserialize(using = CustomDelegatingDeserialization.class)来启用这个自定义的委托反序列化器--这是示例化它的正确方法吗?
下面是我的自定义委托器的一个片段:

public static class CustomDeserializer extends DelegatingDeserializer {

    public CustomDeserializer() {
      super(null);
    }

    public CustomDeserializer(JsonDeserializer<?> defaultDeserializer) {
      super(defaultDeserializer);
    }

    @Override
    protected JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegatee) {
      return new CustomDeserializer(newDelegatee);
    }

    @Override
    public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
      return super.deserialize(restructure(p), ctxt);
    }

    private JsonParser restructure(JsonParser jp) throws IOException {

     ...
      return newJsonParser;
   }
}

我走的是正确的道路还是有更合适的解决方案??
谢谢你!

编辑1

另一种方法是有一个CustomJsonDeserializer extends JsonDeserializer<T>并覆盖它的deserialize方法,然后重构Node并通过返回codec.treeToValue(jsonNode, Pojo.class);来传播它,这是有意义的但是它让我进入了无限循环!知道为什么吗?

fv2wmkja

fv2wmkja1#

假设你的POJO没有你想忽略的属性,你可以为你的类使用注解@JsonIgnoreProperties(ignoreUnknown = true)。这告诉Jeckson忽略你的POJO中没有的属性。在这里阅读更多关于如何忽略一些属性的问题:Jackson Unmarshalling JSON with Unknown Properties

相关问题