Json Jackson自定义泛型反序列化程序
我需要创建自定义类型的bean反序列化程序。 T是一个独立性Json Jackson自定义泛型反序列化程序,json,rest,generics,serialization,jackson,Json,Rest,Generics,Serialization,Jackson,我需要创建自定义类型的bean反序列化程序。 T是一个独立性 public interface IEntity { public int getId(); } @JsonDeserialize(using = RestLoaderRequestDeserializer.class) @Produces(MediaType.APPLICATION_JSON) public class RestLoaderRequest<T extends IEntity> Serializa
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反序列化程序根本不应该处理类型:而是使用单独的TypeSerializer和TypeDeserializer。这样做是为了防止组合数量的爆炸;对于不同的包含机制,有两个TypeSerializer/-Deserializer实现,但有数百个值反序列化器
当您拥有完全控制权时,自定义反序列化程序显然可以打破这种分离。但是core Jackson有这种分离,您可以在标准处理程序中看到示例。您还可以提供您试图反序列化的JSON吗?这是个好问题,因为实体字段根本没有序列化。我最终编写了自己的自定义序列化程序,然后我知道如何反序列化它。我稍后会发布正确答案。谢谢你的回复,我不知道。谢谢你的信息。我很快会查的。