jackson和genericstypes的参考
我想使用jacksonjson库的一般方法,如下所示:
public MyRequest<T> tester(){ TypeReference<MyWrapper<T>> typeRef = new TypeReference<MyWrapper<T>>(); MyWrapper<T> requestWrapper = (MyWrapper<T>) JsonConverter.fromJson(jsonRequest, typeRef); return requestWrapper.getRequest(); }
public class MyWrapper<T> { private MyRequest<T> request; public MyRequest<T> getRequest() { return request; } public void setRequest(MyRequest<T> request) { this.request = request; } } public class MyRequest{ private List<T> myobjects; public void setMyObjects(List<T> ets) { this.myobjects = ets; } @NotNull @JsonIgnore public T getMyObject() { return myobjects.get(0); } }
现在的问题是,当我调用请求对象jackson内的getMyObject()时,将嵌套的自定义对象作为LinkedHashMap返回。 有什么方法可以指定T对象需要返回吗? 例如:如果我发送了Customertypes的对象,那么Customer应该从List返回。
谢谢。
这是Javatypes擦除的一个众所周知的问题:T只是一个typesvariables,并且必须指示实际的类,通常作为Class参数。 没有这些信息,最好的办法就是使用界限; 普通T与“T扩展对象”大致相同。 jackson将把JSON对象绑定为地图。
在这种情况下,testing者方法需要访问Class,并且可以构造
JavaType type = mapper.getTypeFactory(). constructCollectionType(List.class, Foo.class)
接着
List<Foo> list = mapper.readValue(new File("input.json"), type);
'JavaType'的作品! 我试图解开(反序列化)JSONstring列表到ArrayList Java对象,并努力寻找解决scheme,因为天。
下面是最终给我的解决scheme的代码。 码:
JsonMarshallerUnmarshaller<T> { T targetClass; public ArrayList<T> unmarshal(String jsonString) { ObjectMapper mapper = new ObjectMapper(); AnnotationIntrospector introspector = new JacksonAnnotationIntrospector(); mapper.getDeserializationConfig() .withAnnotationIntrospector(introspector); mapper.getSerializationConfig() .withAnnotationIntrospector(introspector); JavaType type = mapper.getTypeFactory(). constructCollectionType( ArrayList.class, targetclass.getClass()); try { Class c1 = this.targetclass.getClass(); Class c2 = this.targetclass1.getClass(); ArrayList<T> temp = (ArrayList<T>) mapper.readValue(jsonString, type); return temp ; } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null ; } }