如果 jackson 在 json 中值为 null,则为属性提供默认值
give a default value for an attribute if the value is null in json by jackson
假设我有 class 即
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
的值(获取来自 class 中声明的属性的默认值)。
现在如果 json 是 "{x:null}"
那么 x 的值变成 null
但即使在这种情况下我也希望 x
的值是 1000
. 如何通过 jackson 做到这一点。提前致谢。
我正在通过以下方法反序列化,如果它有帮助的话:
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;
}
}
从 json 反对,您可以在 setter 中解决这个问题并告诉 Jackson 不要使用字段访问,而是使用 setter 进行解组。
考虑延长 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);
public class Student {
private Integer x = Integer.valueOf(1000);
public Integer getX() {
return x;
}
public void setX(Integer x) {
if(x != null) {
this.x = x;
}
}
}
这对我有用........
测试代码1:
public static void main(String[] args) throws IOException {
String s = "{\"x\":null}";
ObjectMapper mapper = new ObjectMapper();
Student ss = mapper.readValue(s, Student.class);
System.out.println(ss.getX());
}
输出:
1000
测试代码2:
public static void main(String[] args) throws IOException {
String s = "{}";
ObjectMapper mapper = new ObjectMapper();
Student ss = mapper.readValue(s, Student.class);
System.out.println(ss.getX());
}
输出:
1000
假设我有 class 即
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
的值(获取来自 class 中声明的属性的默认值)。
现在如果 json 是 "{x:null}"
那么 x 的值变成 null
但即使在这种情况下我也希望 x
的值是 1000
. 如何通过 jackson 做到这一点。提前致谢。
我正在通过以下方法反序列化,如果它有帮助的话:
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;
}
}
从 json 反对,您可以在 setter 中解决这个问题并告诉 Jackson 不要使用字段访问,而是使用 setter 进行解组。
考虑延长 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);
public class Student {
private Integer x = Integer.valueOf(1000);
public Integer getX() {
return x;
}
public void setX(Integer x) {
if(x != null) {
this.x = x;
}
}
}
这对我有用........
测试代码1:
public static void main(String[] args) throws IOException {
String s = "{\"x\":null}";
ObjectMapper mapper = new ObjectMapper();
Student ss = mapper.readValue(s, Student.class);
System.out.println(ss.getX());
}
输出:
1000
测试代码2:
public static void main(String[] args) throws IOException {
String s = "{}";
ObjectMapper mapper = new ObjectMapper();
Student ss = mapper.readValue(s, Student.class);
System.out.println(ss.getX());
}
输出:
1000