使用Restcontroller将空值转换为空字符串

时间:2015-05-06 19:52:12

标签: java json spring rest spring-4

我在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>

此外,链接中的解决方案并不总是与其他尝试过的人一起工作。

是否有一种优雅的方法可以将具有空值的字段转换为空字符串?最好带注释。

3 个答案:

答案 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;
}

这确保了如果firstlast字段通过任何其他方式(可能是序列化)设置为null,它们仍将返回空字符串而不是空值。