当前位置: 首页 > 知识库问答 >
问题:

在Jackson的反序列化过程中,如何在验证JSON有效负载时抛出异常?

乐正迪
2023-03-14

我正在创建一个自定义Jackson反序列化器类来将JSON负载映射到一个对象。在我的deserialize方法中,我对JSON负载进行了一些检查,以查看是否缺少任何字段或与POJO不一致。

我尝试在deserialize方法中抛出异常,方法如下所示:

@Override
public MyObject deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
   // if some fields are missing throw error:
   throw new MissingFieldsException("name field is missing");
} 

但是,我不允许在deserialize方法中抛出我自己的异常,因为该方法实现了一个接口,我只能抛出IOExceptionJSONProcessingException:

public abstract T deserialize(JsonParser p, DeserializationContext ctxt)
        throws IOException, JsonProcessingException;

在这种情况下,当执行反序列化时,如何验证JSON有效负载?

共有1个答案

丁鹏鹍
2023-03-14

确切地说,JSONProcessingException类不受“保护”。该类的构造函数是。因此您可以很容易地扩展该类--正如注释所建议的那样--使用一些公共构造函数,例如:

@SuppressWarnings("serial")
public static class MyJsonProcessingException extends JsonProcessingException {
    protected MyJsonProcessingException(String msg) {
        super(msg);
    }
}

还可以通过为主体提供new运算符将其声明为匿名内部类。如:

throw new JsonProcessingException("Error msg") {};

为此,您可能还需要添加以下内容:

private static final long serialVersionUID = 1L;
@SuppressWarnings("serial")
public static class MyJsonProcessingRuntimeException extends RuntimeException {}

但是在runtimeexception的情况下,您需要在编码时更加小心--所以要注意它可以在没有任何声明的情况下抛出--所以最好扩展JSONProcessingException

 类似资料: