更改Jackson中的默认序列化行为

时间:2013-04-25 02:51:18

标签: java json serialization jackson

我正在使用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对象按预期序列化?

2 个答案:

答案 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
        }
}