Jackson动态属性名称

我想序列化一个对象,以便根据字段的类型对字段之一进行不同的命名。例如:

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>

以上是 Jackson动态属性名称 的全部内容, 来源链接: utcz.com/qa/413442.html

回到顶部