我需要创建自定义jackson通用类型bean解串器。 T是实现IEntity的bean。Jackson自定义通用解串器
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)如何做自动反序列化?
你还可以提供你试图反序列化的JSON吗? – Eugen
这是个好问题,因为“实体”字段根本没有序列化。我最终编写了自己的自定义序列化程序,然后我知道如何反序列化它。我稍后会发布正确答案。但谢谢你的回复。 – termil0r