Джексон/YAML: анализировать ключ-значение в классе

У меня есть входной файл yaml, у меня есть следующее:

services:
  postgresql:
    image: "postgres:10"
  redis:
    image: "redis:4"

Поле services легко разобрать на Map<String, Service>:

public class DockerCompose {
    public static class Service {
        private String image;
    }

    private Map<String, Service> services;
}

Я хотел бы проанализировать поле services в List<Service> с именем в поле name в Service следующим образом:

public class DockerCompose {
    public static class Service {
        private String name;
        private String image;
    }

    private List<Service> services;
}

Это возможно?


person Franz They    schedule 14.11.2017    source источник


Ответы (1)


Самый простой вариант — добавить собственный сеттер для десериализации и геттер для сериализации.

public static class DockerCompose {

    public static class Service {
        @JsonIgnore // for serialization
        private String name;
        private String image;
    }

    @JsonProperty("services") // for derserialization
    public void setServicesMap(Map<String, Service> servicesMap){
        for (Map.Entry<String, Service> entry  :servicesMap.entrySet()) {
            entry.getValue().name = entry.getKey();
            services.add(entry.getValue());
        }
    }

    @JsonProperty("services") // for serialization
    public Map<String, Service> getServicesMap() {
        Map<String, Service> map = new HashMap<>();
        for(Service s: services)
            map.put(s.getName(), s);
        return map;
    }

    @JsonIgnore // for serialization
    private List<Service> services = new ArrayList<>();
}
person varren    schedule 14.11.2017