gpt4 book ai didi

java - 如何忽略导致 jackson 反序列化错误的列表条目?

转载 作者:行者123 更新时间:2023-12-03 08:39:13 25 4
gpt4 key购买 nike

我正在尝试使用 Jackson 反序列化 JSON 结构,并且正在使用如下所示的 DTO:

public class RootLevelDTO {

private List<ComplexEntry> complexEntries;
// ... other fields, not relevant

}
现在, ComplexEntry可以有子类型,那些具有枚举类型的属性等。如果通信的另一方更新他们的 API 和例如添加另一个子类型或添加枚举文字。
我想做的是告诉 jackson :
  • 如果在 complexEntries 的反序列化过程中遇到任何数据绑定(bind)错误场...
  • ... 做 不是 抛出异常,而是 忽略 此条目并继续下一个。

  • 到目前为止,我尝试的是为 ComplexEntry 使用委托(delegate)解串器。 :
    public class ComplexEntryDeserializer extends StdDeserializer<ComplexEntry> {

    private StdDeserializer<ComplexEntry> delegate;

    public ComplexEntryDeserializer(StdDeserializer<ComplexEntry> delegate){
    this.delegate = delegate;
    }

    public ComplexEntry deserialize(JsonParser p, DeserializationContext ctxt){
    try {
    return this.delegate.deserialize(p, ctxt);
    }catch(Exception e){
    // the list entry failed to deserialize, but we have to return *something* here
    return null;
    }
    }

    // ... other mandatory methods, not relevant here
    }
    这个方案有个问题是会引入 null complexEntries 的值列表,然后我必须使用 Converter 明确删除它.
    这个问题有更优雅的解决方案吗?

    最佳答案

    经过大量的修补,我最终得到了以下解决方案。它不需要任何额外的 jackson 模块或其他魔法,只需要一个(特定的)解串器。
    DTO:

    public class RootLevelDTO {

    // use a custom deserializer for the list
    @JsonDeserialize(using = ListOfComplexEntryDeserializer.class)
    private List<ComplexEntry> complexEntries;

    }
    解串器:
    public class ListOfComplexEntryDeserializer extends JsonDeserializer<List<ComplexEntry>> {

    @Override
    public List<ComplexEntry> deserialize(JsonParser p, DeserializationContext ctxt) {
    List<ComplexEntry> resultList = new ArrayList<>();
    while(p.nextToken() != JsonToken.END_ARRAY){
    try {
    // delegate the deserialization of the individual list entries to the standard deserializers
    resultList.add(ctxt.readValue(p, ComplexEntry.class))
    }catch(Exception e){
    // log that the entry wasn't deserialized properly
    System.out.println("ComplexEntry could not be read and will be ignored.");
    }
    }
    return resultList;
    }

    }

    大免责声明:虽然上面的代码 作品 ,这不是你应该设计的东西。我真的背对着墙,别无选择(由于我无法控制的外部因素),在这种情况下它是有效的。

    关于java - 如何忽略导致 jackson 反序列化错误的列表条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63559544/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com