使用Jackson的自定义JSON字段作为响应

时间:2018-08-27 12:03:29

标签: java json spring rest

我有一些使用Spring Boot创建的RESTful WS,并且某些端点的方法之一返回某个类的实例,然后将使用嵌入式Jackson库将其转换为JSON。即使某些字段为空,Jackson也会将每个字段转换为JSON。因此,在输出中它将如下所示:

WebEngineScript

在某些情况下,我想忽略某些字段的输出。在某些情况下,并非每次都这样。怎么做?

3 个答案:

答案 0 :(得分:3)

要使用Jackson> 2.0抑制具有空值的序列化属性,可以直接配置ObjectMapper,或使用@JsonInclude批注:

mapper.setSerializationInclusion(Include.NON_NULL);

或:

@JsonInclude(Include.NON_NULL)
class Foo
{
  String field1;
  String field2;
  String field3;
}

或者,您可以在getter中使用@JsonInclude,以便在值不为null时显示属性。

完整示例可在How to prevent null values inside a Map and null fields inside a bean from getting serialized through Jackson

获得

答案 1 :(得分:1)

要排除空值,可以使用

@JsonInclude(value = Include.NON_NULL)
public class YourClass {
}

要包含自定义值,您可以使用

public class Employee {
  private String name;
  @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = DateOfBirthFilter.class)
  private Date dateOfBirth;
  @JsonInclude(content = JsonInclude.Include.CUSTOM, contentFilter = PhoneFilter.class)
  private Map<String, String> phones;
}

public class DateOfBirthFilter {

  @Override
  public boolean equals(Object obj) {
      if (obj == null || !(obj instanceof Date)) {
          return false;
      }
      //date should be in the past
      Date date = (Date) obj;
      return !date.before(new Date());
  }
}

public class PhoneFilter {
  private static Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}");

  @Override
  public boolean equals(Object obj) {
      if (obj == null || !(obj instanceof String)) {
          return false;
      }
      //phone must match the regex pattern
      return !phonePattern.matcher(obj.toString()).matches();
  }
}

取自https://www.logicbig.com/tutorials/misc/jackson/json-include-customized.html的参考

答案 2 :(得分:0)

在类的顶部,添加NON_NULL Jackson批注,以在接收或发送时忽略空值

@JsonInclude(value = Include.NON_NULL)
public class SomeClass {
}