我想编写一个自定义的Jackson反序列化器,它将允许我仅反序列化对象的一个属性。例如,对于一个班级:
class Student {
@JsonDeserialize(using = IdDeserializer.class)
Project project;
}
和json
{
project: {
id: 2
}
}
它应该创建一个项目ID为2的学生对象。如果json包含任何其他项目属性,则应忽略它们,否则可能引发异常。
我还希望我的解串器具有多态性。换句话说,我想在类型扩展接口HasIdentifier
的任何字段上使用它。
public interface HasIdentifier {
Integer getId();
void setId(Integer id);
}
到目前为止,我有类似这样的内容,但不幸的是handledType()
总是返回null。所以我的问题是如何获取当前正在反序列化的字段类型。
public class IdDeserializer<T extends HasIdentifier> extends StdDeserializer<T> {
protected IdDeserializer() {
this(null);
}
protected IdDeserializer(final Class<HasIdentifier> vc) {
super(vc);
}
@Override
public T deserialize(final JsonParser arg0, final DeserializationContext arg1)
throws IOException, JsonProcessingException {
try {
final T obj = (T) handledType().newInstance();
obj.setId(5);
return obj;
} catch (final Exception e) {
throw new IOException(e);
}
}
}