Сериализация по Джексону конечных полей без аннотаций - PullRequest
1 голос
/ 25 февраля 2020

У меня есть класс с закрытым конструктором, который я не могу изменить, содержащий много финальных полей, которые я sh могу сериализовать с Джексоном. Есть ли способ заставить Джексона сериализовать все последние поля?

Я пытался использовать пользовательский поставщик фильтров, например так: new ObjectMapper().setFilterProvider(new SimpleFilterProvider().addFilter("serialize-final", SimpleBeanPropertyFilter.serializeAll())), но Джексон, похоже, отфильтровывает последние поля до / после применения моих filter.

Вариант использования - моя программа зависит от библиотеки, которая использует флаги функций, чтобы указать, какие функции включены. Распространитель библиотеки скомпилировал флаги функций в конечные поля одноэлементного объекта, к которому я могу получить доступ во время выполнения. Я ш sh добавить возможность сбросить флаги функций при запросе, чтобы для облегчения отладки и просто сериализации их как JSON кажется, что простое решение.

1 Ответ

0 голосов
/ 25 февраля 2020

Я предполагаю, что синглтон не имеет геттеров для последних полей (иначе он работает из коробки). Вы можете использовать средство проверки видимости поля, как предложено в этом ответе :

    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;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...