【问题标题】:how to ignore json attribute dynamically如何动态忽略json属性
【发布时间】:2015-10-18 09:31:30
【问题描述】:

假设我有一个 Common Employee dto,如下所示

public class Employee {

    @JsonProperty("name")
    public String name;

    @JsonProperty("departments")
    public List<Department> departments;

    @JsonProperty("designation")
    public String designation;

    //setters and getters
}

Employee dto 可用于员工和经理。我正在使用一个外部 REST 服务,我将从那里获得员工和经理的详细信息。对于员工,传入的 json 将不包含字段部门,但对于经理,传入的 json 将包含一个额外的部门字段。员工和经理传入的json如下图所示

员工 json

{
  "name": "Vineeth",
  "designation": "Developer"
}

经理 json

{
  "name": "Rohit",
  "designation": "Manager",
  "departments": ["Dept1", "Dept2", "Dept3"]
}

解组工作正常,但问题是当我再次为员工编组回 json 时,我会变成这样

{
  "name": "Vineeth",
  "designation": "Developer",
  "departments": null
}

如果在编组 dto like 期间字段不存在,谁能告诉我如何忽略或删除字段

对于Staff,编组后应该如下所示

{
  "name": "Vineeth",
  "designation": "Developer"
}

对于经理来说,它应该如下所示在编组之后

{
  "name": "Rohit",
  "designation": "Manager",
  "departments": ["Dept1", "Dept2", "Dept3"]
}

【问题讨论】:

  • 除了下面的答案之外,在设计类时尝试考虑封装 - 你不想让成员变量public,让它们成为“私有”(或者protected,如果你实现我的子类化建议) - 你想保护你的类不被其他类不正确地改变它们的状态。

标签: java json jackson marshalling unmarshalling


【解决方案1】:

如果员工的部门总是null,那么让 JSON 编组器忽略空值也许是可以接受的。这可以使用此处描述的注释来实现:How to tell Jackson to ignore a field during serialization if its value is null?

或者,您可以考虑将 Employee 设为抽象类,从中删除部门列表,并使用 StaffManager 对其进行子类化。

“经理”类将是抽象的并定义名称和名称:

public abstract class Manager {

  @JsonProperty("name")
  public String name;

  @JsonProperty("designation")
  public String designation;
}

'Staff` 类会非常简单:

public class Staff extends Employee {}

“经理”类将包含部门列表:

public class Manager extends Employee {
  @JsonProperty("departments")
  public List<Department> departments;
}

【讨论】:

猜你喜欢
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2018-12-12
  • 2010-11-25
相关资源
最近更新 更多