java - 杰克逊在没有注释的情况下强制序列化最终字段
问题描述
我有一个带有我无法修改的私有构造函数的类,其中包含许多我希望与杰克逊一起序列化的最终字段。有什么办法可以强制杰克逊序列化所有的最终字段?
我尝试过使用这样的自定义过滤器提供程序:new ObjectMapper().setFilterProvider(new SimpleFilterProvider().addFilter("serialize-final", SimpleBeanPropertyFilter.serializeAll()))
但杰克逊似乎在应用我的过滤器之前/之后过滤掉了最终字段。
用例是我的程序依赖于一个库,该库使用功能标志来指示启用了哪些功能。该库的分发者已将功能标志编译到我能够在运行时访问的单例对象上的最终字段中。我希望添加在请求时转储功能标志的功能,以便更轻松地调试并将它们简单地序列化为 JSON 似乎是最简单的解决方案。
解决方案
我假设单例没有用于最终字段的吸气剂(否则它可以开箱即用)。您可以按照此答案中的建议使用字段可见性检查器:
public class SerializeFinalFields {
@Test
public void doTest() throws JsonProcessingException {
final TestClass t = new TestClass("flag");
final ObjectMapper om = new ObjectMapper();
// Older jackson versions:
// om.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
// om.setVisibility(
// om.getSerializationConfig().getDefaultVisibilityChecker()
// .withFieldVisibility(JsonAutoDetect.Visibility.ANY));
// newer jackson versions:
om.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
final String json = om.writeValueAsString(t);
System.out.println(json);
}
}
class TestClass {
private final String myField;
/* package */ TestClass(final String myField) {
this.myField = myField;
}
}
推荐阅读
- javascript - 为什么它返回null?
- javascript - 键入“npx webpack”命令后,可能导致此“写入 EOF”错误的原因是什么?
- css - 如何准确打印页面在屏幕上的外观?
- excel - 如何使用 vba 匹配列并计算匹配项
- javascript - 如何减少ant design在元素之间应用的默认边距/填充
- javascript - Mongoose updateMany 文档包含特定的 Array 元素
- c++ - 如何使用 Eigen 求解具有 Neumann 型边界条件的方程组?
- python - 具有数组数据类型的 z3 建模图
- python - 和运营商的不一致
- django - 如何在 Django 中执行数据库中的代码