我正在使用Jackson将json字符串转换为Java对象.我班上有一门选修课.每当我试图反序列化缺少可选字段的字符串时,它为该字段生成null
而不是Optional.empty()
.
下面是代码:
public class Main {
public static void main(String[] args) throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jdk8Module());
Person1 p1 = mapper.readValue("{\"name\": \"harsh\"}", Person1.class);
System.out.println(p1);
}
}
@EqualsAndHashCode
@ToString
@Getter
@Builder
@NoArgsConstructor(force = true)
public class Person1 {
public final String name;
public final Optional<Integer> age;
public Person1(String name, Optional<Integer> age) {
this.name = name;
this.age = age;
}
}
它会生成以下输出:
Person1(name=harsh, age=null)
然而,我希望它能产生:
Person1(name=harsh, age=Optional.empty)
我还try 添加了OptionalIntegerDeserializer
个客户反序列化程序,如下所示,但似乎不起作用:
public class Person1 {
public final String name;
@JsonDeserialize(using = OptionalIntegerDeserializer.class)
public final Optional<Integer> age;
public Person1(String name, Optional<Integer> age) {
this.name = name;
this.age = age;
}
public static class OptionalIntegerDeserializer extends StdDeserializer<Optional<Integer>> {
public OptionalIntegerDeserializer() {
super(Optional.class);
}
@Override
public Optional<Integer> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonNode node = p.readValueAsTree();
if (node.isNull()) {
return Optional.empty();
} else {
return Optional.of(node.intValue());
}
}
}
}
有没有办法为缺失的字段生成Optional.empty
而不是null
?