杰克逊:从json中删除一些值并保留一些空值

时间:2017-07-10 05:28:52

标签: java json jackson

我有一个这样的模型:

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)

并且第二个问题是,null值不能包含在JSON中。

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

非常感谢。

1 个答案:

答案 0 :(得分:1)

使用@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
}