使用杰克逊ObjectMapper与泛型的POJO代替LinkedHashMap的
使用泽西我喜欢定义一个服务:使用杰克逊ObjectMapper与泛型的POJO代替LinkedHashMap的
@Path("/studentIds")
public void writeList(JsonArray<Long> studentIds){
//iterate over studentIds and save them
}
其中JsonArray是:
public class JsonArray<T> extends ArrayList<T> {
public JsonArray(String v) throws IOException {
ObjectMapper objectMapper = new ObjectMapper(new MappingJsonFactory());
TypeReference<ArrayList<T>> typeRef = new TypeReference<ArrayList<T>>() {};
ArrayList<T> list = objectMapper.readValue(v, typeRef);
for (T x : list) {
this.add((T) x);
}
}
}
这一切正常,但是当我做更复杂的东西:
@Path("/studentIds")
public void writeList(JsonArray<TypeIdentifier> studentIds){
//iterate over studentIds and save them by type
}
凡Bean是一个简单的POJO如
public class TypeIdentifier {
private String type;
private Long id;
//getters/setters
}
整件事发生了可怕的事情。它将一切转换为LinkedHashMap而不是实际的对象。我可以得到它的工作,如果我手动创建类如:
public class JsonArrayTypeIdentifier extends ArrayList<TypeIdentifier> {
public JsonArrayTypeIdentifier(String v) throws IOException {
ObjectMapper objectMapper = new ObjectMapper(new MappingJsonFactory());
TypeReference<ArrayList<TypeIdentifier>> typeRef = new TypeReference<ArrayList<TypeIdentifier>>(){};
ArrayList<TypeIdentifier> list = objectMapper.readValue(v, typeRef);
for(TypeIdentifier x : list){
this.add((TypeIdentifier) x);
}
}
}
但我试图保持这个很好,通用,而无需添加额外的类遍及。任何线索为什么只有通用版本发生这种情况?
首先,它适用于Longs,因为它是一种本地类型,并且是JSON整数的默认绑定。
但是,为什么泛型类型信息不正确地传递:这很可能是由于与JAX-RS API传递键入MessageBodyReader
S和MessageBodyWriter
S中的方法问题 - 通过java.lang.reflect.Type
不是(可惜!)足以传递实际的通用声明(欲了解更多信息,请阅读this blog entry)。
一个简单的解决办法是创建助手类型,如:
class MyTypeIdentifierArray extends JsonArray<TypeIdentifier> { }
,并使用该类型 - 事情会“只是工作”,因为超强型通用信息会始终保留。
你的工作没有'工作。 (仍然给我LinkedHashMap作为解析结果。回到我的长解决方法。叹气。 – 2012-01-18 17:38:20
它肯定应该工作 - 你能告诉我你究竟如何解析它们?LinkedHashMap只有在缺少类型信息(或如果'Object.class'被定义为类型),这是哪个杰克逊版本? – StaxMan 2012-01-18 19:50:42
杰克逊版本1.9.2; – 2012-01-19 21:14:34
查看可能与接受的答案重复:http://*.com/questions/6062011/jackson-is-not-deserialising-a-generic-list-that-it-has-serialised – 2013-04-14 15:23:16