首页 > 解决方案 > 杰克逊在没有注释的情况下强制序列化最终字段

问题描述

我有一个带有我无法修改的私有构造函数的类,其中包含许多我希望与杰克逊一起序列化的最终字段。有什么办法可以强制杰克逊序列化所有的最终字段?

我尝试过使用这样的自定义过滤器提供程序:new ObjectMapper().setFilterProvider(new SimpleFilterProvider().addFilter("serialize-final", SimpleBeanPropertyFilter.serializeAll()))但杰克逊似乎在应用我的过滤器之前/之后过滤掉了最终字段。

用例是我的程序依赖于一个库,该库使用功能标志来指示启用了哪些功能。该库的分发者已将功能标志编译到我能够在运行时访问的单例对象上的最终字段中。我希望添加在请求时转储功能标志的功能,以便更轻松地调试并将它们简单地序列化为 JSON 似乎是最简单的解决方案。

标签: javajsonserializationjackson

解决方案


我假设单例没有用于最终字段的吸气剂(否则它可以开箱即用)。您可以按照此答案中的建议使用字段可见性检查器:

    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;
        }
    }

推荐阅读