【问题标题】:How to ignore invalid value and set null value when use jackson paring json string from webfront?使用jackson从webfront解析json字符串时如何忽略无效值并设置空值?
【发布时间】:2019-12-05 08:35:19
【问题描述】:

有没有什么好的方法可以改变解析策略,即使出来一个值也不能转换为特定类型,只是设置为null并继续解析。

这是错误信息。

15:39:29 WARN  (DefaultHandlerExceptionResolver.java:424) Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.math.BigDecimal` from String "-": not a valid representation; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.math.BigDecimal` from String "-": not a valid representation
 at [Source: (PushbackInputStream); line: 1, column: 1483] (through reference chain: com.vicson.SGHDGD.base.model.DailyOutputUpdatePojo["sheet0"]->com.vicson.SGHDGD.base.model.UpdateSheet["insertRows"]->java.util.ArrayList[1]->com.vicson.SGHDGD.base.model.DailyOutput["weekOutputDRatio"])

【问题讨论】:

  • 你正试图将一个字符串放入一个 BigDecimal ......显然它不会工作
  • 这与 JSON 无关,但您如何将 desh(-) 表示为数字?
  • 设置空值并继续解析,如果字符串无效。
  • 你没有。通过注册异常处理程序并向客户端发送带有适当描述性消息的错误请求响应来处理异常。

标签: java json spring-mvc jackson2


【解决方案1】:

最简单的方法是让 String 字段从 JSON 成功反序列化。然后在接收字段值的 setter/constructor 中解析BigDecimal。像这样:

public void setWeekOutputDRatio(String value){
  try{
    this.weekOutputDRatio = new BigDecimal(value.toCharArray())
  } catch (Exception ignored) {
    this.weekOutputDRatio = DEFAULT_VALUE;
  }
}

【讨论】:

  • 无效值可以是任何属性,所以它不能解决我的问题
  • 这应该是一个可以接受的答案。最好的解决方案是对表单参数使用验证器,不要将无效值传递给服务器端,但这种方式是最简单的解决方案。
猜你喜欢
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
  • 2016-10-06
相关资源
最近更新 更多