我在Spring中使用@RestController并得到以下响应:
{"name":"Khan","first":null,"last":null}
我希望null为""
(空字符串)
我不想做一些丑陋的事情,就像用空字符串初始化每个属性一样:
@Transient private String first="";
@Transient private String last="";
我找到了一个讨论how to implement this solution "for Jackson < 2.0)"的链接,但我使用的是Jackson库&gt; 2.0喜欢:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.1</version>
</dependency>
此外,链接中的解决方案并不总是与其他尝试过的人一起工作。
是否有一种优雅的方法可以将具有空值的字段转换为空字符串?最好带注释。
答案 0 :(得分:3)
我之前的回答是不可接受的,因为它不包括注释和序列化程序。所以参考this链接(我通过搜索“杰克逊2.0自定义序列化程序”在谷歌上找到),我想这应该有用(假设你的类是Person
,因为它没有指定):
public class PersonSerializer extends JsonSerializer<Person> {
@Override
public void serialize(Person value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeStringField("name", value.name);
if (value.first == null) {
jgen.writeStringField("first", "");
}else{
jgen.writeStringField("first", value.first);
}
if(value.last == null){
jgen.writeStringField("last", "");
}else{
jgen.writeStringField("last", value.last);
}
jgen.writeEndObject();
}
}
然后是你的班级
@JsonSerialize(using = PersonSerializer.class)
public class Person {
//First/Last name etc
}
我认为您应该重新评估为什么要为此设置自定义解析器,如果您继续阅读本答案顶部的整个链接,您将看到自定义解析器的用例以及它与您的不同之处。在他的情况下,他想要返回一些与该字段没有直接关系的数据,而您只是想将null
视为空字符串。
答案 1 :(得分:0)
您可以覆盖setFirst和setLast。
public void setFirst(String first) {
if(first == null) {
this.first = "";
} else {
this.first = first;
}
}
答案 2 :(得分:0)
我认为@Raphael Amoedo处于正确的轨道上,但我认为问题的本质意味着解决方案是将其放在getFirst()
和getLast()
方法中。 / p>
public string getFirst(){
if (this.first == null) return "";
return this.first;
}
public string getLast(){
if (this.last == null) return "";
return this.last;
}
这确保了如果first
和last
字段通过任何其他方式(可能是序列化)设置为null,它们仍将返回空字符串而不是空值。