【问题标题】:Custom JSON fields with Jackson in response带有 Jackson 的自定义 JSON 字段作为响应
【发布时间】:2018-08-27 12:03:29
【问题描述】:

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

{
    "field1": "res1",
    "field2": "res2",
    "field3": null
}

我想在特定情况下忽略某些字段作为输出。不是每次,在某些情况下。怎么做?

【问题讨论】:

  • @JsonInclude(Include.NON_NULL) 放在课堂上

标签: java json spring rest


【解决方案1】:

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

mapper.setSerializationInclusion(Include.NON_NULL);

或:

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

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

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

【讨论】:

    【解决方案2】:

    要排除空值,您可以使用

    @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

    【讨论】:

      【解决方案3】:

      在您的班级顶部添加 NON_NULL Jackson 注释以在接收或发送时忽略空值

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

      【讨论】:

        猜你喜欢
        • 2018-11-15
        • 1970-01-01
        • 2015-06-24
        • 2018-12-25
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 1970-01-01
        • 2020-11-14
        相关资源
        最近更新 更多