【问题标题】:Changing the default serialization behavior in Jackson更改 Jackson 中的默认序列化行为
【发布时间】:2013-04-18 19:21:36
【问题描述】:

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

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:

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

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

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

    objectMapper.enable(MapperFeature.USE_STATIC_TYPING);
    

    【讨论】:

    • 感谢您的回复。强制静态类型不会改变结果。我不确定“为值类型注册序列化程序”是什么意思,举个例子会很有帮助。
    • 我的意思是你不能指出“将它用于任何java.lang.Object”以用于所有事情——你必须为你想要覆盖的实际类型执行“addSerializer”。或者,如果您不关心 Jackson 提供的任何默认序列化程序,您可以硬编码处理(根据您的回答)。
    【解决方案2】:

    我已经通过编写一个序列化程序并使用一系列 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
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2013-02-05
      • 1970-01-01
      • 2013-09-01
      • 2016-02-25
      • 1970-01-01
      • 2020-03-07
      相关资源
      最近更新 更多