У меня есть класс со следующими полями и соответствующими им геттерами, а также дополнительный метод 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, в конце концов я получил это сериализованное. Как это возможно?
Большое спасибо! Такое поведение теперь имеет гораздо больше смысла.
Просто чтобы уточнить, откуда берется текст "totalBalance", в JSON: я предполагаю (но у меня нет официальной ссылки/цитации), что Джексон следует Стандарты именования JavaBeans (замените get, а затем сделайте T строчными буквами) для преобразования имя метода в ключ JSON. (Противоположно тому, что обычно делают генераторы кода геттера.) Кто-нибудь поправит меня, если я ошибаюсь?
@andrewJames это в значительной степени так, но также он преобразует последовательные начальные прописные буквы в строчные (пример getID становится «id»)




Джексон (по умолчанию) не заботится о полях. Он просто сериализует все, что предоставляется геттерами, и десериализует все с помощью соответствующего сеттера. То, что делают эти геттеры/сеттеры, не имеет значения.
Имейте в виду, однако, что каждая мелочь в Джексоне может быть глубоко настроена и настроена, поэтому я говорю только о настройке по умолчанию.
Сначала мне было странно добиться сериализации/десериализации объектов с этой настройкой по умолчанию. Теперь, когда я это изучил, я могу попробовать настроить его. Спасибо
Джексон по умолчанию использует геттеры для сериализации и сеттеры для десериализации.
Вы можете использовать @JsonIgnore поверх своего метода получения, чтобы игнорировать его, ИЛИ вы можете настроить свой объектный преобразователь для использования полей только для сериализации/дес:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
Обратите внимание, что поведение Java обычно определяется вокруг характеристики, которые определяются (общедоступными) геттерами и/или сеттерами; наличие у этих свойств резервных полей обычно формально не имеет значения.