【问题标题】:boolean JSON parameter is false after using default ObjectMapper使用默认 ObjectMapper 后布尔 JSON 参数为 false
【发布时间】:2018-12-03 12:08:05
【问题描述】:

我有带有布尔 (isBlocked) 参数的 JSON 响应

{"isBlocked":true,"responseId":"ab123456789", "other":"irrelevant"}

我的 ResponseVO(使用 Eclipse 自动生成 getter 和 setter):

@JsonIgnoreProperties(ignoreUnknown = true)
public class ResponseVO {

private boolean isBlocked;
private String responseId;
public boolean isBlocked() {
    return isBlocked;
}
public void setBlocked(boolean isBlocked) {
    this.isBlocked = isBlocked;
}
public String getResponseId() {
    return responseId;
}
public void setResponseId(String responseId) {
    this.responseId = responseId;
}   

}

我正在使用ObjectMapper 设置 VO 对象

ResponseVO responseVO = new ObjectMapper().readValue(response, ResponseVO.class);

但是布尔参数设置为false而不是true

logger.debug("SpelPaus Block=" + responseVO.isBlocked());

【问题讨论】:

  • 您的 JSON 应该有一个名为“blocked”的属性,而不是“isBlocked”。或者你应该有一个 JsonProperty 注释告诉杰克逊使用“isBlocked”而不是“blocked”。
  • 在我在本地尝试之前,我会假设您的命名已关闭。我猜应该是setIsBlockedisIsBlocked,因为字段名包含is。您可以使用 @JsonProperty 注释来设置 JSON 道具的名称。 // 编辑:是的,重命名 getter 和 setter 或将 @JsonProperty("isBlocked") 添加到字段中。
  • @Tom 添加 JsonProperty 有效,但 getter/setter 是自动生成的,是否也是 eclipse 问题?
  • Eclipse 没有问题。问题是 JSON 中的错误命名(如 JB Nizet 解释的那样),并且 ObjectMapper 可能会使用反射和原始数据查找 getter 和 setter(当没有具有适当注释 @JsonGetter@JsonSetter 的匹配方法时)字段名称附加 get/isset 到该名称
  • @Tom 我不能将其归咎于 命名错误,因为这是第三方响应

标签: java json eclipse boolean objectmapper


【解决方案1】:

将私有属性重命名为private boolean blocked;

setter-getter 为

public boolean isBlocked()
    {return blocked;}

public void setBlocked(boolean blocked)
    {this.blocked = blocked;}

【讨论】:

  • 还需要添加@JsonProperty("isBlocked")
猜你喜欢
  • 1970-01-01
  • 2015-01-11
  • 2012-02-21
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 2015-02-21
  • 1970-01-01
相关资源
最近更新 更多