【问题标题】:Parsing with Jackson: throwing exception when format is unexpected使用 Jackson 解析:格式异常时抛出异常
【发布时间】:2016-06-11 17:56:39
【问题描述】:

我正在寻找防止 Jackson 解析“错误”格式的数据的方法。例如,如果我们不想允许 null 作为文本值,则以下内容将继续进行:

jsonNode.textValue() // this will always return a String

如果我们必须阻止 null 值被解析,我们将不得不执行以下操作:

if (jsonNode.isNull())
   throw Exception();
return jsonNode.textValue();

同样,如果我们尝试解析一个整数,它几乎会尝试任何东西。如果无法解析,asInt()intValue() 都将返回 0:

如果表示不能转换为int(包括结构化 Objects 和 Arrays 等类型),将返回默认值 0; 不会抛出异常。

好吧,如果我想处理这些未知的、非法的、错误的、不可能的或任何你想称之为的转换怎么办?发生这种情况时似乎没有任何转换方法会为您抛出异常,似乎它们都无论如何都会执行转换。

对于最后一个例子,当然,我可以像第一个例子那样做:

if (!jsonNode.isInt())
    throw new Exception();

但是每次解析一个值时都必须这样做是很烦人的。我希望某些方法会抛出异常。

我遗漏了 Jackson 的一些明显特征,或者根本没有像我描述的那样的方法?

【问题讨论】:

  • 非常好的问题。我想知道为什么 Jackson 的默认方法是不惜一切代价尝试转换类型,而不是一开始就期望正确的类型并将不匹配视为逻辑错误。
  • 是的......或者至少他们应该有方法来强制转换为预期的类型,然后是一组不同的安全方法。

标签: java json jackson


【解决方案1】:

没有。至少在JsonNodes 可用时不会。如果 Jackson 遇到无法解析的内容,ObjectMapper 将抛出 JsonParseExceptionJsonMappingExceptionnull 是有效的 JSON 数据类型,因此遇到空值并不意外。检查 null 是用户的工作 - 验证。

所以你可以:

  • 使用您的isInt/isNull 方法
  • 实现你自己的JsonParser
  • 或查看JsonSchema(这可能是矫枉过正)

【讨论】:

    【解决方案2】:

    我认为最简单的方法是自己解析int

    int intValue = Integer.parseInt(jsonNode.textValue());
    

    如果号码无效,这将抛出 NumberFormatException

    【讨论】:

    • 是的,我也尝试了其他方法,但我问的是杰克逊是否有针对这些情况的异常抛出方法。
    猜你喜欢
    • 1970-01-01
    • 2012-05-23
    • 2020-04-17
    • 2020-11-20
    • 2014-07-11
    • 2013-05-24
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多