我想序列化一个对象,以便根据字段的类型对字段之一进行不同的命名。例如:
public class Response { private Status status; private String error; private Object data; [ getters, setters ] }
在这里,我希望将该字段data序列化为类似的内容,data.getClass.getName()而不是总是data根据情况将字段称为包含不同类型的字段。
data
data.getClass.getName()
使用Jackson怎么能达到这样的目的?
使用自定义JsonSerializer。
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>。
p
JsonSerializer<Response>