我正在使用Jackson库编写自定义序列化程序,并在自定义ObjectMapper中注册它们。但是,我还想更改默认序列化,以便在未编写更具体的自定义序列化时输出对象的字符串表示形式。
例如,除了默认的序列化程序之外,我还说过为“Map”和“Entry”类编写自定义序列化程序。然后我的自定义ObjectMapper中的序列化模块可能如下所示:
SimpleModule module = new SimpleModule("module", new Version(0, 1, 0, "alpha", null, null));
module.addSerializer(Entry.class, new EntryJsonSerializer());
module.addSerializer(Map.class, new MapJsonSerializer());
module.addSerializer(Object.class, new DefaultJsonSerializer());
this.registerModule(module);
但是,我发现模块将使用DefaultJsonSerializer来序列化Map和Entry对象(因为它们也是Object对象)。
如何确保默认的序列化行为,同时确保Entry和Map对象按预期序列化?
答案 0 :(得分:1)
问题可能是实际类型的值(比如String)用于定位序列化程序。
一种解决方案是为值类型注册序列化器,如果你知道的话。
或者,您可以强制使用静态类型;这将使序列化程序查找使用声明(静态)类型,而不是实际的运行时类型。 这可以通过以下方式完成:
objectMapper.enable(MapperFeature.USE_STATIC_TYPING);
答案 1 :(得分:1)
通过编写单个序列化程序并使用一系列if语句来实现优先级,我解决了这个问题:
public final class UnifiedJsonSerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object object, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
if (object instanceof Entry) {
// Entry serialization code
} else if (object instanceof Map) {
// Map serialization code
} else {
// default serialization code
}
}