Jackson通过类名创建对象

时间:2018-12-04 10:42:42

标签: java jackson jackson2

是否有机会读取json类名称并创建和对象?

这是我的意思:

我有一个界面

public interface Converter {
    void process();
}

接下来,我也有一些数据类

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

还有一个实现Converter接口的类

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

最后但并非最不重要。这是我的json的一部分:

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

因此,想法是在通过Jackson的mapper.readValue阅读Json时创建一个DataConverter,以便Data类中的getter可以使用它。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以通过编写自定义序列化器和反序列器,然后在Source类中对该字段进行注释来实现此目的。为此,您需要实现Converter接口。该文档建议:

  

注意:强烈建议实现者扩展StdConverter而不是直接实现Converter,因为这可以帮助默认实现典型的样板代码。

因此,您要针对自定义序列化程序执行以下操作:

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注释转换器字段并引用该转换器。