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

标签 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 对象按预期序列化?

最佳答案

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

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

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

objectMapper.enable(MapperFeature.USE_STATIC_TYPING);

关于java - 更改 Jackson 中的默认序列化行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16205586/

相关文章:

java - TransactionRolledbackLocalException 客户端的事务在访问@Singleton 时中止

java - Java 方法注释如何与方法覆盖结合使用?

c# - 反序列化错误: End of Stream encountered before parsing was completed

laravel - 如何在laravel数据表中添加行号或序列号

java - 将 JTabbedpane 拖出到窗口并自动创建新的 JFrame

java - SPRING BOOT - 如何从 Super POM 访问类

javascript - jsRender for in for,但是针对2种不同的结构

c# - 验证文件后错误无效的 json 原语

json - 仅在一个级别创建一个随 secret 钥

JavaScript:序列化后保留方法