Java 使用Jackson为不同请求对单个实体的不同属性进行JSON序列化
有几个REST调用需要具有不同属性集的相同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
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注释的信息