Пользовательский сериализатор и десериализатор Джексона с условиями - PullRequest
2 голосов
/ 08 июля 2019

Я не могу найти правильный способ манипулирования регистром значения с помощью пользовательской аннотации, которой я могу управлять условно.

Я уже изучал онлайн-уроки Джексона с JsonFilters, сериализацией, десериализацией - большинство из них работали, но не с моим желаемым результатом.

Пользовательский сериализатор:

public class CaseSerializer extends JsonSerializer<String> {
    private boolean myCheck;

    public CaseSerializer() {
        // default
    }

    public CaseSerializer(boolean myControl) {
        this.myCheck = myControl;
    }

    @Override
    public void serialize(String value, JsonGenerator generator, SerializerProvider provider) throws IOException {
        if (value != null) {
            if (myCheck) {
                generator.writeString(value.toUpperCase());
            } else {
                generator.writeString(value);
            }
        }
    }
}

Персона Модель:

public class Person {
    @JsonSerialize(using = CaseSerializer.class)
    private String title;
    private String firstName;
    private String lastName;

    public Person(String title, String firstName, String lastName) {
        this.title = title;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // getters, setters & toString
}

Использование:

        Person person = new Person("dr", "john", "doe");

        SimpleModule module = new SimpleModule();
        module.addSerializer(String.class,new CaseSerializer(true));

        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(module);
        String titleShouldBeUpper = mapper.writeValueAsString(person);

        System.out.println(titleShouldBeUpper);

После запуска предоставленного кода я ожидаю, чтополе title внутри класса Person должно быть прописным, а остальные значения должны оставаться такими, как они были.

(CaseSerializer (true) означает, что я хочу прописать значения в верхнем регистре)

Это не так, поскольку код выводит следующий вывод:

{"title":"dr","firstName":"JOHN","lastName":"DOE"}

Когда я запускаюкод с CaseSerializer () без логического myControl, установленного в true, ожидаемый результат - ни одно из полей не является заглавными.

Что и происходит:

{"title":"dr","firstName":"john","lastName":"doe"}

Это означает, чтопо умолчанию ничего не изменится.

Если я вызываю маппер с истинным значением для сериализации регистра, мне нужны только поля, в которых присутствует JsonSerialize (используя = CaseSerializer.class).

Есть идеи?

...