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
注释转换器字段并引用转换器。
是否有机会从 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
注释转换器字段并引用转换器。