Java 使用Jackson为不同请求对单个实体的不同属性进行JSON序列化

Java 使用Jackson为不同请求对单个实体的不同属性进行JSON序列化,java,json,serialization,jackson,json-serialization,Java,Json,Serialization,Jackson,Json Serialization,有几个REST调用需要具有不同属性集的相同JSON实体。实体示例: public class JsonEntity { public String id; public String name; public String type; public String model; } JsonEntity是不同调用的复杂响应的一部分。第一个调用需要整个JsonEntity而不做任何更改。第二次调用需要JsonEntity而不需要type和model属性。第三个需要JsonE

有几个REST调用需要具有不同属性集的相同JSON实体。实体示例:

public class JsonEntity
{
   public String id;
   public String name;
   public String type;
   public String model;
}
JsonEntity
是不同调用的复杂响应的一部分。第一个调用需要整个
JsonEntity
而不做任何更改。第二次调用需要
JsonEntity
而不需要
type
model
属性。第三个需要
JsonEntity
而不需要
name
属性


根据特定的上下文(除了分离
JsonEntity
)是否有任何方法可以使用Jackson检索具有特定属性集的相同JSON实体?

我看到了三种方法:

1。使用@JsonGetter

此注释告诉jackson使用metho而不是字段进行序列化。 创建
JsonEntity
的3个子类,每个响应一个子类。更改
JsonEntity
并在每个字段上使用
@IgnoreField
,如果可能,使它们受到
保护。在每个子类上,为需要的字段创建特定的getter,例如:

public class JsonEntitySecondCall extends JsonEntity
{
  @JsonGetter("id")
  public String getId(){
    return id;
  }

 @JsonGetter("name")
 public String getName(){
    return name;
  }
}
另外,为
JsonEntity
创建克隆/复制构造函数。对于第二个调用,通过克隆原始的
JsonEntity
创建一个新的
JsonEntitySecondCall
,并在API中使用它。由于anotation,创建的对象将只序列化给定的字段。我不认为你可以直接投射你的物体,因为杰克逊使用反射

2。使用@AnyGetter

AnyGetter注释允许您定义要序列化的内容的映射:

private Map<String, Object> properties = new HashMap<>();

@JsonAnyGetter
public Map<String, Object> properties() {
    return properties;
}
private Map properties=new HashMap();
@JsonAnyGetter
公共地图属性(){
归还财产;
}
现在,您只需要告诉您的
JsonEntity
在每次调用之前需要返回哪些属性(您可以创建3个方法,每个上下文一个,并使用枚举设置必须使用哪个方法)

3。使用@JsonInclude(Include.NON_NULL)

此注释告诉Jackson如果字段为null,则不要序列化该字段。然后可以克隆对象并将不想发送的字段设置为空。(这仅在不应向API发送null元素时有效)

更多关于Jackson注释的信息