java - Jackson:反序列化列表时捕获单个项目的异常

标签 java json jackson mapping

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

现在我希望映射器仍将其映射到列表,同时抛出有问题的 MyObjects。但是,调用

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

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

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

非常感谢任何如何与 jackson 一起实现这一目标的想法。

最佳答案

我能够通过使用 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}]

关于java - Jackson:反序列化列表时捕获单个项目的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33477685/

相关文章:

java - Jackson(fasterxml)反序列化的理解

java - 为什么扫描仪每隔一行读取 CSV 文件? java

xml - 解析具有相同名称的嵌套 XML 标记

java - 替代连续 String.replace

ios - STHTTPRequest如何发布数据而不是键值?

python - py2exe 无法识别 jsonschema

java - 使用 Jackson 反序列化数组

java - Json/Jackson 命名约定

java - 线程- sleep 和中断

javascript - 在 API 中使用不同的计算规则