我有一个像这样的模型:

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中不能包含null值。

所以我可以保留空值并防止在不创建额外模型的情况下将某些其他属性包含在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
}

07-24 09:18