我有一个json字符串,我应该反序列化到下面的类
class Data <T> {
int found;
Class<T> hits
}
我该怎么做? 这是通常的做法
mapper.readValue(jsonString, Data.class);
但是我怎么提到T代表什么呢?
我有一个json字符串,我应该反序列化到下面的类
class Data <T> {
int found;
Class<T> hits
}
我该怎么做? 这是通常的做法
mapper.readValue(jsonString, Data.class);
但是我怎么提到T代表什么呢?
当前回答
你要做的第一件事是序列化,然后你可以反序列化。 所以当你序列化时,你应该使用@JsonTypeInfo让jackson把类信息写进你的json数据。你可以这样做: 类数据<T> { int发现; @JsonTypeInfo(使用= JsonTypeInfo.Id.CLASS,包含= JsonTypeInfo.As。财产,财产= " @class”) 类< T > } 然后当你反序列化时,你会发现jackson已经将你的数据反序列化为一个类,你的变量在运行时实际上是命中的。
其他回答
您需要为所使用的每个泛型类型创建一个TypeReference对象,并使用该对象进行反序列化。例如:
mapper.readValue(jsonString, new TypeReference<Data<String>>() {});
对于类Data<>
ObjectMapper mapper = new ObjectMapper();
JavaType type = mapper.getTypeFactory().constructParametrizedType(Data.class, Data.class, Parameter.class);
Data<Parameter> dataParam = mapper.readValue(jsonString,type)
public class Data<T> extends JsonDeserializer implements ContextualDeserializer {
private Class<T> cls;
public JsonDeserializer createContextual(DeserializationContext ctx, BeanProperty prop) throws JsonMappingException {
cls = (Class<T>) ctx.getContextualType().getRawClass();
return this;
}
...
}
你可以把它包装在另一个类中,这个类知道你的泛型类型的类型。
Eg,
class Wrapper {
private Data<Something> data;
}
mapper.readValue(jsonString, Wrapper.class);
这里Something是一个具体的类型。每个具体化类型都需要一个包装器。否则Jackson就不知道该创建什么对象。
你要做的第一件事是序列化,然后你可以反序列化。 所以当你序列化时,你应该使用@JsonTypeInfo让jackson把类信息写进你的json数据。你可以这样做: 类数据<T> { int发现; @JsonTypeInfo(使用= JsonTypeInfo.Id.CLASS,包含= JsonTypeInfo.As。财产,财产= " @class”) 类< T > } 然后当你反序列化时,你会发现jackson已经将你的数据反序列化为一个类,你的变量在运行时实际上是命中的。