java – Jackson:从json中删除一些值并保留一些空值

我有这样的模型:

public class Employee {
    @JsonProperty("emplyee_id")
    private Integer id;
    @JsonProperty("emplyee_first_name")
    private String firstName;
    @JsonProperty("emplyee_last_name")
    private String lastName;
    @JsonProperty("emplyee_address")
    private String address;
    @JsonProperty("emplyee_age")
    private Byte age;
    @JsonProperty("emplyee_level")
    private Byte level;

    //getters and setters
}

现在我需要使用这个(唯一的)模型创建两个JSON.

第一个必须这样,例如:

{
    "employee_id":101,
    "employee_first_name":"Alex",
    "employee_last_name":"Light",
    "employee_age":null,
    "employee_address":null
}

第二个必须像这样:

{
    "employee_id":101,
    "employee_level":5
}

顺便说一句,我已经测试了@JsonIgnore和@JsonInclude(JsonInclude.Include.NON_NULL).

第一个(我知道的)问题是,那些字段不能包含在其他JSON中(例如,如果level获取此注释,它将不包含在第二个JSON中)

而第二个的问题是,空值不能包含在JSON中.

那么我可以保留空值并阻止一些其他属性包含在JSON中而无需创建额外的模型吗?如果答案是肯定的,我该怎么办呢?如果不是我真的很感激,如果有人给我这个状态的最佳解决方案.

非常感谢.

最佳答案 它对你使用@JsonView注释很有用

public class Views {
    public static class Public {
    }
    public static class Base {
    }
 }



public class Employee {
   @JsonProperty("emplyee_id")
   @JsonView({View.Public.class,View.Base.class})
   private Integer id;

   @JsonProperty("emplyee_first_name")
   @JsonView(View.Public.class)
   private String firstName;

   @JsonProperty("emplyee_last_name")
   @JsonView(View.Public.class)
   private String lastName;

   @JsonProperty("emplyee_address")
   private String address;

   @JsonProperty("emplyee_age")
   private Byte age;

   @JsonProperty("emplyee_level")
   @JsonView(View.Base.class)
   private Byte level;

   //getters and setters
 }

在你的json响应中添加@JsonView(Public / Base.class)它将基于jsonview注释返回

//requestmapping
@JsonView(View.Public.class)  
public ResponseEntity<Employee> getEmployeeWithPublicView(){
    //do something
}

响应:

{ 
  "employee_id":101,
  "employee_first_name":"Alex",
  "employee_last_name":"Light",
  "employee_age":null,
  "employee_address":null
}

对于第二个

//requestmapping
@JsonView(View.Base.class)  
public ResponseEntity<Employee> getEmployeeWithBaseView(){
    //do something
}

响应

{
   "employee_id":101,
   "employee_level":5
}
点赞