Джексон создает объект по имени класса - PullRequest
0 голосов
/ 04 декабря 2018

Есть ли возможность прочитать из имени класса json и создать и объект?

Вот что я имею в виду:

У меня есть интерфейс

public interface Converter {
    void process();
}

Далее у меня также есть некоторый класс данных

public class Source {
    private String service;
    private String path;
    private Converter converter;
}

И класскоторый реализует интерфейс конвертера

public class DataConverter implements Converter {
    public void process() {
        //some code here
    }
}

Последнее, но не менее важное.Это часть моего json:

"source": {
    "service": "VIS",
    "path": "/",
    "converter": "DataConverter"
}

Итак, идея заключается в том, чтобы при чтении Json через Джексона mapper.readValue создать DataConverter, чтобы он был доступен из класса Data через геттер.

Спасибо!

1 Ответ

0 голосов
/ 04 декабря 2018

Этого можно добиться, написав пользовательские сериализаторы и десериализаторы, а затем аннотируя поле в вашем классе Source.Для этого вам необходимо реализовать интерфейс Converter.Документация предлагает:

ПРИМЕЧАНИЕ: разработчикам настоятельно рекомендуется расширять StdConverter вместо непосредственной реализации Converter, поскольку это может помочь с реализацией по умолчанию, как правило, стандартного кода.

Итак, вы хотите сделать что-то вроде этого для пользовательского Serialiser:

public class ConverterSerializer extends StdConverter<Converter, String> {

@Override
public String convert(Converter value) {
    if(value instanceof DataConverter) {
        return "DataConverter";
    } ...

    return "";
}

}

И затем аннотируйте значение с помощью @JsonSerialize:

@JsonSerialize(using = ConverterSerializer.class)
private Converter converter;

То же самое относится и к десериализации, но вы бы реализовали StdConverter<String,Converter>, для которого метод convert примет String и вернет Converter.Затем вы должны аннотировать поле преобразователя с помощью @JsonDeserialize и ссылаться на преобразователь.

...