Значение по умолчанию в Java
Не каждый внешний документ содержит полный набор ключей. Если в обычном классе полю задано значение при объявлении, Jackson после создания объекта оставит его, когда ключ в JSON отсутствует.
Настройки интерфейса часто описывают темой и размером шрифта. Для темы можно оставить запасной вариант прямо в поле класса:
import com.fasterxml.jackson.databind.ObjectMapper;
public class UiPrefs {
private String theme = "light";
private int fontSize;
public String getTheme() {
return theme;
}
public void setTheme(String theme) {
this.theme = theme;
}
public int getFontSize() {
return fontSize;
}
public void setFontSize(int fontSize) {
this.fontSize = fontSize;
}
}
public class Main {
public static void main(String[] args) throws Exception {
String raw = "{\"fontSize\":16}";
ObjectMapper mapper = new ObjectMapper();
UiPrefs prefs = mapper.readValue(raw, UiPrefs.class);
System.out.println(prefs.getTheme());
System.out.println(prefs.getFontSize());
}
}
Ключ theme в тексте отсутствует, поэтому
поле остаётся "light". Компонент
fontSize берётся из JSON как 16.
При записи поля с default попадают в строку вместе с остальными свойствами. Проверим полный и укороченный объект:
import com.fasterxml.jackson.databind.ObjectMapper;
public class UiPrefs {
private String theme = "light";
private int fontSize;
public String getTheme() {
return theme;
}
public void setTheme(String theme) {
this.theme = theme;
}
public int getFontSize() {
return fontSize;
}
public void setFontSize(int fontSize) {
this.fontSize = fontSize;
}
}
public class Main {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
UiPrefs full = new UiPrefs();
full.setTheme("dark");
full.setFontSize(14);
UiPrefs shortPrefs = mapper.readValue(
"{\"fontSize\":14}",
UiPrefs.class
);
System.out.println(mapper.writeValueAsString(full));
System.out.println(shortPrefs.getTheme());
}
}
У record все компоненты обязательны в
конструкторе, поэтому для пропущенных ключей чаще
берут класс с полями, как выше, или отдельный
урок про record с явной схемой JSON.
Дана строка JSON:
String raw = "{\"priority\":2}";
Сделайте класс AlertConfig с полем
channel по умолчанию "email"
и обязательным priority типа int
с геттерами и сеттерами. Из этой строки
получите объект и выведите канал и приоритет.
Создайте AlertConfig только с приоритетом
1 через разбор короткого JSON без ключа
канала. Затем задайте канал "sms"
и тот же приоритет, запишите оба объекта в текст
и выведите обе строки подряд.