【问题标题】:Jackson: Custom JSON deserializerJackson:自定义 JSON 反序列化器
【发布时间】:2011-04-12 06:54:53
【问题描述】:

我正在使用 Jackson 库的 ObjectMapper 将 JSON 反序列化为 Java 对象。我正在使用 Spring '接线'。我创建了自定义反序列化器来执行从 JSON 字符串到 POJO 的转换。然而,当输入错误(例如,一个数字作为“124A” - 非法字符传递)时,会调用默认的反序列化器并使用 NumberFormatException 进行轰炸。有没有办法阻止调用默认转换器?

【问题讨论】:

  • 听起来您希望正确解析无效的 json,这听起来不对。我错过了什么吗?
  • 没错。当 JSON 字符串格式正确时(例如 JSON 编号“123”),调用自定义反序列化器没有任何问题,但是当输入包含非法字符(例如 JSON 编号“123A”)时,不会调用自定义反序列化器,a而是调用默认的反序列化器。
  • 你是不是解析器给出了错误?输入必须始终是有效的 JSON;只有这样才能反序列化(从JSON类型到Java类型)。
  • 解析器中有一些方便的方法可以调用反序列化器(通过 ObjectMapper),所以在某种程度上是的。

标签: java json spring serialization jackson


【解决方案1】:

好的,假设输入不是有效的 JSON(数字不能以'$'开头或包含'$'),解串器将不会被调用,任何更改都必须应用于解析器。 Jackson 中没有允许将此类内容视为数字的开关。

如果您可以控制输入,只需将值更改为字符串(在值周围添加双引号)。 Parser 然后将其作为 JSON String 传递,数据绑定组件有机会处理它(JsonDeserializer)。

【讨论】:

  • 我将金额作为字符串传递并使用自定义反序列化器转换为数字。完美运行!
  • 事实证明,无论出于何种原因,我都无法将数量作为字符串传递,有没有办法在应用程序中捕获这些异常? (我使用 Jetty 来运行我的服务器)
  • 您可以捕获异常,但不确定这是否有很大帮助——解析器可能不会读取整个内容。但是为什么首先以无效(非 JSON)格式打印数字?这不是可以解决的问题吗?
  • 理想情况下它不应该是无效格式。但是,作为对此问题的一般保护措施,我认为捕获所有无效的 json 请求会很好。
  • 无论如何,解析器都必须放弃。如果您想验证,您可以做的一件事是使用流解析器 (JsonParser),继续迭代,准确了解失败的原因(您将获得可用的属性名称)。
猜你喜欢
  • 2016-01-29
  • 2013-01-18
  • 2014-08-02
  • 2013-10-10
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多