【问题标题】:jackson: catch exceptions for single items when deserializing a listjackson:反序列化列表时捕获单个项目的异常
【发布时间】:2015-11-02 12:33:30
【问题描述】:

我有以下问题:有一个 REST API 返回我想要映射到列表的 JSON 字符串。 MyObject 有几个字段,其中一些是 int/double。让我们考虑一下 API 可能会为其中一个字段返回字符串而不是整数/双精度数,以供某些 MyObjects 使用,其余的都可以。

现在我希望映射器在丢弃有故障的 MyObjects 时仍将其映射到列表。但是,调用

objectMapper.readValue(jsonString, TypeFactory.defaultInstance().constructCollectionType(List.class, MyObject.class));

如果所有 MyObjects 都正常,则要么成功,要么在遇到第一个问题时完全失败。

我希望找到一个地方,映射器在其中迭代 JSON-MyObjects 列表并将它们一个一个映射到 Java-MyObjects。这样我就可以覆盖该行为,并可能用 try-catch 块包围它并捕获映射单个 MyObject 时发生的任何异常。到目前为止没有运气,但也许我只是瞎了。

非常感谢任何想法如何使用 jackson 完成此任务。

【问题讨论】:

    标签: java json jackson mapping


    【解决方案1】:

    我能够通过使用 Jackson 的自定义反序列化器来实现这一点:

    这是我的 MyObject 目标类。它有一个注释,它与一个自定义反序列化器相关联:

    @JsonDeserialize(using = MyObjectDeserializer.class)
    public class MyObject
    {
        public int num;
        public String str;
    
        @Override
        public String toString()
        {
            return "{" + num + "," + str + "}";
        }
    }
    

    这是自定义反序列化程序。它检查“num”属性的类型是否为 int 类型:

    public class MyObjectDeserializer extends JsonDeserializer<MyObject>
    {
        // read current MyObject json node
        JsonNode myObjectNode = jp.getCodec().readTree(jp);// this will read 
        // read "num" property into JsonNode and check what subclass was created
        JsonNode numNode = myObjectNode.get("num");
        if (numNode instanceof IntNode) {  // test if value of num is int indeed
            MyObject o = new  MyObject();
            o.num = ((IntNode)numNode).intValue();  // read int value
            o.str = ((TextNode)myObjectNode.get("str")).asText();  // this is how to read string typed property
            return o;
        } else {
            return null;  // or any default/error value
        }
    }
    

    现在假设以下输入,注意第二个对象有一个字符串类型为“num”的属性:

    [{"num":1,"str":"n1"}, {"num":"s","str":"n2"}, {"num":3,"str":"n3"}]
    

    如果没有自定义反序列化器,您会遇到异常。并用它得到输出:

    [{1,n1}, null, {3,n3}]
    

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 2018-12-02
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      相关资源
      最近更新 更多