【发布时间】:2018-12-19 18:07:01
【问题描述】:
我有一个名为 Resource 的自定义超类,我希望每次序列化 Resource 的实例(或子类的实例)时都会向 JSON 添加两个额外的字段。我正在使用 Spring Boot(如果这很重要)和 Jackson。我的想法是定义一个自定义序列化器供 Jackson 使用,但是我当前的实现存在一些问题。
@JsonComponent
public class CustomJsonSerializer extends JsonSerializer<Resource> {
@Override
public void serialize(Resource resource, JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeStringField("type", "special");
jsonGenerator.writeFieldName("data");
jsonGenerator.writeObject(resource);
jsonGenerator.writeFieldName("links");
jsonGenerator.writeObject(resource.getId());
jsonGenerator.writeEndObject();
}
}
不幸的是,调用 writeObject(resource) 只是重新进入我的 CustomJsonSerializer 进入递归循环。
重要的一点,资源可以嵌套,因此使用默认序列化器简单地序列化资源是不够的。
我正在寻找类似于writeAllFields(resource) 方法的东西。当然可以使用反射自己实现一个,但是我忽略了所有的 Jackson 注释,这也是我想避免的。
编辑:
Resource 类是一个超类型,并且预期的行为是 Resource 的所有子类都通过这个序列化程序(这已经是这种情况了)。
public class Resource {
String id;
protected Resource() {}
public String getId() {
return id;
}
}
public class Item extends Resource {
// Fields and methods, nothing special
}
编辑 2: 万一这很重要,这就是我向 Spring Boot 注册我的序列化程序的方式:
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
SimpleModule m = new SimpleModule();
m.addSerializer(Resource.class, new CustomJsonSerializer());
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().modules(m);
converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
}
【问题讨论】:
-
能贴出Resource类的源码定义吗?
-
@EricGreen 我用您要求的信息更新了问题。
-
在您的序列化程序中,您调用了#links 方法,但我在您的 Resource 类的定义中没有看到它。
-
我的错,我稍微简化了代码以使其更易于理解。
-
那么,您是否要序列化 Resource 的具体子类,例如 {"links":
, "data": {"field1": "value1", "field2": "value2" , ...} 其中“数据”由具体子类的所有附加字段组成?
标签: java json spring-boot serialization jackson