我想序列化一个对象,以便根据字段的类型对字段之一进行不同的命名。例如:
public class Response {
private Status status;
private String error;
private Object data;
[ getters, setters ]
}
在这里,我希望将
data
字段序列化为data.getClass.getName()
之类的东西,而不是总是拥有一个称为data
的字段,该字段根据情况包含不同的类型。使用Jackson怎么能达到这样的目的?
最佳答案
使用自定义 JsonSerializer
。
public class Response {
private String status;
private String error;
@JsonProperty("p")
@JsonSerialize(using = CustomSerializer.class)
private Object data;
// ...
}
public class CustomSerializer extends JsonSerializer<Object> {
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
jgen.writeStartObject();
jgen.writeObjectField(value.getClass().getName(), value);
jgen.writeEndObject();
}
}
然后,假设您要序列化以下两个对象:
public static void main(String... args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
Response r1 = new Response("Error", "Some error", 20);
System.out.println(mapper.writeValueAsString(r1));
Response r2 = new Response("Error", "Some error", "some string");
System.out.println(mapper.writeValueAsString(r2));
}
第一个将打印:
{"status":"Error","error":"Some error","p":{"java.lang.Integer":20}}
第二个:
{"status":"Error","error":"Some error","p":{"java.lang.String":"some string"}}
我为包装对象使用了名称
p
,因为它仅用作p
花边持有人。如果要删除它,则必须为整个类编写一个自定义序列化程序,即JsonSerializer<Response>
。关于java - jackson 动态属性名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12134231/