Программисты JAVA общаются здесь
Anonymous
Сопоставление логического значения с перечислением с помощью Джексона
Сообщение
Anonymous » 02 мар 2026, 17:15
Мне нужно десериализовать логическое поле YAML в перечисление и наоборот. У них также разные имена.
Важно, что для поля Java в YAML должен быть только один ключ.
MRE:
Код: Выделить всё
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class YamlTest {
@Test
void testSomething() throws JsonProcessingException {
String yaml = "darkTheme: true";
YAMLFactory factory = new YAMLFactory();
ObjectMapper mapper = new ObjectMapper(factory);
AppSettings settings = mapper.readValue(yaml, AppSettings.class);
assertEquals(AppStyle.DARK, settings.getStyle());
String serializedSettings = mapper.writeValueAsString(settings);
String expectedYaml = "---\n" +
"darkTheme: true\n";
assertEquals(expectedYaml, serializedSettings); // fails
}
}
Код: Выделить всё
import com.fasterxml.jackson.annotation.JsonProperty;
public class AppSettings {
@JsonProperty("darkTheme")
private AppStyle style;
public void setStyle(AppStyle style) {
this.style = style;
}
public AppStyle getStyle() {
return style;
}
}
Код: Выделить всё
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
public enum AppStyle {
BASE, DARK;
@JsonCreator(mode = JsonCreator.Mode.DELEGATING)
public static AppStyle dark(boolean isDark) {
return isDark ? DARK : BASE;
}
@JsonValue
public static boolean isDark(AppStyle style) {
return style == DARK;
}
}
Код: Выделить всё
com.fasterxml.jackson.core
jackson-databind
2.15.1
com.fasterxml.jackson.core
jackson-annotations
2.15.1
com.fasterxml.jackson.dataformat
jackson-dataformat-yaml
2.15.1
Java 8.
Подробнее здесь:
https://stackoverflow.com/questions/798 ... th-jackson
1772460925
Anonymous
Мне нужно десериализовать логическое поле YAML в перечисление и наоборот. У них также разные имена. Важно, что для поля Java в YAML должен быть только один ключ. MRE: [code]import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; public class YamlTest { @Test void testSomething() throws JsonProcessingException { String yaml = "darkTheme: true"; YAMLFactory factory = new YAMLFactory(); ObjectMapper mapper = new ObjectMapper(factory); AppSettings settings = mapper.readValue(yaml, AppSettings.class); assertEquals(AppStyle.DARK, settings.getStyle()); String serializedSettings = mapper.writeValueAsString(settings); String expectedYaml = "---\n" + "darkTheme: true\n"; assertEquals(expectedYaml, serializedSettings); // fails } } [/code] [code]import com.fasterxml.jackson.annotation.JsonProperty; public class AppSettings { @JsonProperty("darkTheme") private AppStyle style; public void setStyle(AppStyle style) { this.style = style; } public AppStyle getStyle() { return style; } } [/code] [code]import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; public enum AppStyle { BASE, DARK; @JsonCreator(mode = JsonCreator.Mode.DELEGATING) public static AppStyle dark(boolean isDark) { return isDark ? DARK : BASE; } @JsonValue public static boolean isDark(AppStyle style) { return style == DARK; } } [/code] [code] com.fasterxml.jackson.core jackson-databind 2.15.1 com.fasterxml.jackson.core jackson-annotations 2.15.1 com.fasterxml.jackson.dataformat jackson-dataformat-yaml 2.15.1 [/code] Java 8. Подробнее здесь: [url]https://stackoverflow.com/questions/79899478/mapping-boolean-to-enum-with-jackson[/url]