Jackson 按 class 名称创建对象

Jackson create object by class name

是否有机会从 json class 名称中读取并创建对象?

我的意思是:

我有接口

public interface Converter {
    void process();
}

接下来我还有一些数据class

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

还有一个实现转换器接口的class

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

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

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

所以我的想法是在通过 Jackson 的 mapper.readValue 阅读 Json 时创建一个 DataConverter,这样它就可以从 Data class 通过 getter.

谢谢!

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

NOTE: implementors are strongly encouraged to extend StdConverter instead of directly implementing Converter, since that can help with default implementation of typically boiler-plate code.

所以你想要做的是对自定义序列化程序这样的事情:

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 和 return Converter。然后,您将使用 @JsonDeserialize 注释转换器字段并引用转换器。