我需要创建自定义jackson泛型bean反序列化器。 T是实现IEntity的bean。
public interface IEntity {
public int getId();
}
@JsonDeserialize(using = RestLoaderRequestDeserializer.class)
@Produces(MediaType.APPLICATION_JSON)
public class RestLoaderRequest<T extends IEntity> Serializable {
private T entity; // entity to load field to
private String className; // actual class of entity
private String fieldName; // fieldName to lazy REST load
// constructors(non parameter & all parameter), getters, setters, hashCode, equals, toString
}
现在我拥有的是:
public class RestLoaderRequestDeserializer extends JsonDeserializer<RestLoaderRequest<IEntity>> {
@Override
public RestLoaderRequest<IEntity> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
try {
ObjectCodec objectCodec = jp.getCodec();
JsonNode node = objectCodec.readTree(jp);
String className = node.get("className").textValue();
String fieldName = node.get("fieldName").textValue();
Class<?> clazz = Class.forName(className);
JsonNode rawEntityNode = node.get("entity");
// How to deserialize rawEntityNode to T based on className ?
RestLoaderRequest<IEntity> request = new RestLoaderRequest<IEntity>();
request.setClassName(className);
request.setFieldName(fieldName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
1)如何基于className自动反序列化实体?
答案 0 :(得分:0)
请记住,类型信息的处理和有效负载数据的处理是分开的。
因此,常规JSON(de)序列化器根本不应该处理类型:而是使用单独的TypeSerializer
和TypeDeserializer
。这样做是为了防止组合数量的爆炸;有几个TypeSerializer / -Deserializer实现(针对不同的包含机制),但有数百个值(de)序列化器。
当您完全控制时,自定义(反)序列化程序显然可以打破这种分离。但核心杰克逊有这种分离,你可以在标准处理程序中看到例子。