2

我正在使用 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 对象?

4

2 回答 2

1

问题可能是值的实际类型(例如,字符串)用于定位序列化程序。

如果您知道它们,一种解决方案是为值类型注册序列化程序。

或者,您可以强制使用静态类型;这将使序列化程序查找使用声明的(静态)类型,而不是实际的运行时类型。这可以通过以下方式完成:

objectMapper.enable(MapperFeature.USE_STATIC_TYPING);
于 2013-04-26T17:12:02.973 回答
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
        }
}
于 2013-04-30T20:25:37.607 回答