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)
Ser*_*ich 20
只有一个建议的解决方案保持default-value在some-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)
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 接口将指定的默认值设置到属性中,如果没有指定,则将请求中的原始值设置到该属性中。
您可以创建自己的 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)
| 归档时间: |
|
| 查看次数: |
89874 次 |
| 最近记录: |