【问题标题】:Spring: boolean variables in objects get returnedSpring:返回对象中的布尔变量
【发布时间】:2015-10-15 19:27:20
【问题描述】:

假设我有一个对象:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Foods {

    public Foods() {}

    @Id
    @JsonProperty
    private String id;

    @JsonProperty
    private String name;

    @JsonProperty
    private Double calories;

    @JsonProperty
    private boolean sweet;

    }

现在,在我的 Spring REST API 调用中,我只填充食物的“名称”字段并将其返回。

我得到这个作为返回 JSON:

  {
    "name": "Strawberry Pies",
    "sweet": false
  }

您可以看到,由于未填充卡路里,因此 JSON 不会返回它。我猜“甜蜜”字段会被填充,因为布尔值的默认值为 false。

但是,如果 JSON 字符串一开始没有填充,我不希望 JSON 字符串返回 false 的“甜蜜”布尔值。有没有办法做到这一点?

【问题讨论】:

  • 简单的答案是NON_NULL 的意思是,“不要包含null 值”。如果String-valued 字段未初始化,它们将是nulls。但是boolean 是原始类型,从不使用空值:false 不是null。如果您确实希望将其排除在外,您可以将“sweet”设为Boolean(即java.lang.Boolean)类型,该包装器也允许nulls。或者,就像建议的另一个答案一样,只需使用NON_DEFAULT
  • @StaxMan Jackson 是否将类实例化一次(使用无参数构造函数)以检查 DEFAULT 值并与您传递的用于序列化的实例进行比较?这样做的动机是什么? (而不仅仅是默认的初始化值。)
  • @SotiriosDelimanolis 这并不意味着“任何默认值都适用于原语”。它的字面意思是“实例化时该类的默认值(使用无参数 ctor)”——要知道那将是什么,需要一个实例来检查这些默认值是什么。
  • @StaxMan Nono,你说的是我的意思。我很好奇为什么会这样。这是一个常见的场景(相对于不序列化默认初始化值,0、false、null)?
  • @StaxMan 我担心意外的实例创建。

标签: java json spring-mvc jackson


【解决方案1】:

使用

注释您的字段(或属性 getter/setter)
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
private boolean sweet;

NON_DEFAULT 状态的 javadoc

值表示只有具有不同值的属性 从默认设置(意思是当 Bean 是 用它的无参数构造函数构造)将被包括在内。

private boolean sweet;

默认值是false。如果这是您序列化的对象的字段值,则 JSON 不会包含它。

同样,如果你有

private boolean sweet = true;

且对应对象的字段值为true,生成的JSON也不会包含它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2018-12-17
    • 2020-06-13
    • 2021-08-23
    相关资源
    最近更新 更多