使用Jackson进行映射时,将默认值设置为空字段

goo*_*man 60 java json jackson

我试图用Jackson将一些JSON对象映射到Java对象.JSON对象中的某些字段是必需的(我可以标记@NotNull),有些是可选的.

与Jackson映射后,未在JSON对象中设置的所有字段在Java中都将具有空值.是否有类似的注释@NotNull可以告诉Jackson为Java类成员设置默认值,以防它为null?

编辑:为了使问题更清楚,这里是一些代码示例.

Java对象:

class JavaObject {
    @NotNull
    public String notNullMember;

    @DefaultValue("Value")
    public String optionalMember;
}
Run Code Online (Sandbox Code Playgroud)

JSON对象可以是:

{
    "notNullMember" : "notNull"
}
Run Code Online (Sandbox Code Playgroud)

要么:

{
    "notNullMember" : "notNull",
    "optionalMember" : "optional"
}
Run Code Online (Sandbox Code Playgroud)

@DefaultValue注释只是为了展示一下我问.这不是一个真正的注释.如果JSON对象与第一个示例中的相似,我想要的值optionalMember"Value"和不是null.是否有注释可以做这样的事情?

Ily*_*lya 68

没有注释来设置默认值.
您只能在java类级别设置默认值:

public class JavaObject 
{
    public String notNullMember;

    public String optionalMember = "Value";
}
Run Code Online (Sandbox Code Playgroud)

  • 如果optionalMember没有json,则给出默认值.如果有json将其设置为"null",则它将为null,而不是"Value" (35认同)
  • 此外,如果类有一个 AllArgsConstructor,默认值将被擦除为 null 参见 /sf/ask/3410814571/ (6认同)

Ser*_*ich 20

只有一个建议的解决方案保持default-valuesome-value:null设定明确(POJO可读性丢失那里,它的笨拙)

这是人们如何保持default-value并且永远不会将其设置为null

@JsonProperty("some-value")
public String someValue = "default-value";

@JsonSetter("some-value")
public void setSomeValue(String s) {
    if (s != null) { 
        someValue = s; 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 也许有一种方法可以适用于班级的所有领域? (2认同)

SPi*_*dey 20

使用JsonSetter带有值的注释Nulls.SKIP

如果您想为 json 请求中未设置的任何参数分配默认值,那么您可以简单地在 POJO 本身中分配它。

如果不使用@JsonSetter(nulls = Nulls.SKIP),则仅当 JSON 中没有值时才会初始化默认值,但如果有人显式放置 null,则可能会导致问题。使用@JsonSetter(nulls = Nulls.SKIP)将告诉 Json 反序列化器避免null初始化。

指示应跳过输入空值并进行默认分配的值;这通常意味着该属性将有其默认值

如下:

public class User {
    @JsonSetter(nulls = Nulls.SKIP)
    private Integer Score = 1000;
    ...
}
Run Code Online (Sandbox Code Playgroud)


小智 11

有一个解决方案,如果使用Lombok的Builder注解,则可以通过@Jacksonized注解将Lombok与Jackson结合起来。

如果没有这个,Lombok 和 Jackson 的组合就无法实现这一点。

通过在属性上添加 ,@Builder.Default您就可以设置默认值。

@Value
@Builder
@Jacksonized
public class SomeClass {

     String field1;
     
     @Builder.Default
     String field2 = "default-value";

}
Run Code Online (Sandbox Code Playgroud)

因此,在传入的 json 请求中,如果未指定 field2,则 Builder.default 注解将允许 Builder 接口将指定的默认值设置到属性中,如果没有指定,则将请求中的原始值设置到该属性中。


Pau*_*Pau 5

您可以创建自己的 JsonDeserializer 并使用 @JsonDeserialize(as = DefaultZero.class)

例如: 要将 BigDecimal 配置为默认为零:

public static class DefaultZero extends JsonDeserializer<BigDecimal> {
    private final JsonDeserializer<BigDecimal> delegate;

    public DefaultZero(JsonDeserializer<BigDecimal> delegate) {
        this.delegate = delegate;
    }

    @Override
    public BigDecimal deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        return jsonParser.getDecimalValue();
    }

    @Override
    public BigDecimal getNullValue(DeserializationContext ctxt) throws JsonMappingException {
        return BigDecimal.ZERO;
    }
}
Run Code Online (Sandbox Code Playgroud)

和用法:

class Sth {

   @JsonDeserialize(as = DefaultZero.class)
   BigDecimal property;
 }
Run Code Online (Sandbox Code Playgroud)