jackson:在反序列化列表时捕获单个项的异常

时间:2015-11-02 12:33:30

标签: java json jackson mapping

我遇到以下问题:有一个REST API,它返回一个我要映射到List的JSON字符串。 MyObject有几个字段,其中一些是int / double。让我们考虑一下,对于某些MyObjects,其中一个字段可以返回字符串而不是整数/双数字,剩下的就好了。

现在我希望映射器仍然将它映射到List,同时抛出错误的MyObjects。但是,请致电

objectMapper.readValue(jsonString, TypeFactory.defaultInstance().constructCollectionType(List.class, MyObject.class));
如果所有MyObjects都没问题,

将成功,或者在遇到第一个问题时,

将完全失败。

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

任何想法如何用杰克逊完成这一点非常感谢。

1 个答案:

答案 0 :(得分:0)

我能够通过使用杰克逊的自定义解串器来实现这一目标:

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

@JsonDeserialize(using = MyObjectDeserializer.class)
public class MyObject
{
    public int num;
    public String str;

    @Override
    public String toString()
    {
        return "{" + num + "," + str + "}";
    }
}

这是自定义反序列化器。它会检查" num"的类型。 property是int typed:

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
    }
}

现在假设以下输入,请注意第二个对象有一个键入的字符串&#34; num&#34;财产:

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

没有自定义反序列化器,您将获得异常。你可以得到输出结果:

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