如果json by jackson中的值为null,则为该属性提供默认值
假设我有类即ie
private class Student {
private Integer x = 1000;
public Integer getX() {
return x;
}
public void setX(Integer x) {
this.x = x;
}
}
现在假设json是"{x:12}"
并进行反序列化,那么x
的值就是12
。 但是,如果json是"{}"
那么x = 1000
的值(get是来自类中声明的属性的默认值)。
现在,如果json是"{x:null}"
那么x的值将变为null
但即使在这种情况下,我也希望x
值为1000
。 如何通过杰克逊做到这一点 。 提前致谢。
我通过下面的方法反序列化,如果它有帮助: objectMapper.readValue(<json string goes here>, Student.class);
你应该能够覆盖setter。 将@JsonProperty(value="x")
注释添加到getter和setter以让Jackson知道如何使用它们:
private class Student {
private static final Integer DEFAULT_X = 1000;
private Integer x = DEFAULT_X;
@JsonProperty(value="x")
public Integer getX() {
return x;
}
@JsonProperty(value="x")
public void setX(Integer x) {
this.x = x == null ? DEFAULT_X : x;
}
}
考虑扩展JsonDeserializer
自定义解串器:
public class StudentDeserializer extends JsonDeserializer<Student> {
@Override
public Student deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
JsonNode node = p.getCodec().readTree(p);
// if JSON is "{}" or "{"x":null}" then create Student with default X
if (node == null || node.get("x").isNull()) {
return new Student();
}
// otherwise create Student with a parsed X value
int x = (Integer) ((IntNode) node.get("x")).numberValue();
Student student = new Student();
student.setX(x);
return student;
}
}
它的用途:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(Student.class, new StudentDeserializer());
mapper.registerModule(module);
Student readValue = mapper.readValue(<your json string goes here>", Student.class);
从json到object,你可以在setter中解决这个问题,并告诉Jackson不要使用Field访问,而是使用setter来解组。
链接地址: http://www.djcxy.com/p/84269.html上一篇: give a default value for an attribute if the value is null in json by jackson