Джексон сериализует свойство геттера для неопределенного поля?

У меня есть класс со следующими полями и соответствующими им геттерами, а также дополнительный метод getTotalBalance, для которого у меня нет никаких полей, кроме пользовательской реализации.

    public class demo{
    private String balance;
    private String blockedBalace;
    private String futureBalance;
    private String availableBalance;
    //getters for previous fields
    public String getTotalBalance(){
    //something..
    }

Когда я сериализую объект этого класса, я получаю следующий вывод JSON.

     {
      "balance": "12.30",
      "blockedBalance":"23.45",
      "futureBalance" :"56.22",
      "availableBalance" :"12.30",
      "totalBalance" : "34.11"
     }

Даже если бы я не объявлял поле для totalBalance, в конце концов я получил это сериализованное. Как это возможно?

Обратите внимание, что поведение Java обычно определяется вокруг характеристики, которые определяются (общедоступными) геттерами и/или сеттерами; наличие у этих свойств резервных полей обычно формально не имеет значения.

chrylis -cautiouslyoptimistic- 05.05.2022 21:53

Большое спасибо! Такое поведение теперь имеет гораздо больше смысла.

Edvestemhem 05.05.2022 22:08

Просто чтобы уточнить, откуда берется текст "totalBalance", в JSON: я предполагаю (но у меня нет официальной ссылки/цитации), что Джексон следует Стандарты именования JavaBeans (замените get, а затем сделайте T строчными буквами) для преобразования имя метода в ключ JSON. (Противоположно тому, что обычно делают генераторы кода геттера.) Кто-нибудь поправит меня, если я ошибаюсь?

andrewJames 05.05.2022 22:08

@andrewJames это в значительной степени так, но также он преобразует последовательные начальные прописные буквы в строчные (пример getID становится «id»)

Bahij.Mik 05.05.2022 22:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Джексон (по умолчанию) не заботится о полях. Он просто сериализует все, что предоставляется геттерами, и десериализует все с помощью соответствующего сеттера. То, что делают эти геттеры/сеттеры, не имеет значения.

Имейте в виду, однако, что каждая мелочь в Джексоне может быть глубоко настроена и настроена, поэтому я говорю только о настройке по умолчанию.

Сначала мне было странно добиться сериализации/десериализации объектов с этой настройкой по умолчанию. Теперь, когда я это изучил, я могу попробовать настроить его. Спасибо

Edvestemhem 05.05.2022 22:11
Ответ принят как подходящий

Джексон по умолчанию использует геттеры для сериализации и сеттеры для десериализации.

Вы можете использовать @JsonIgnore поверх своего метода получения, чтобы игнорировать его, ИЛИ вы можете настроить свой объектный преобразователь для использования полей только для сериализации/дес:

ObjectMapper objectMapper = new ObjectMapper();

objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

Другие вопросы по теме