techzen techzen - 14 days ago 6
JSON Question

Jackson and generic type reference

I want to use jackson json library for a generic method as follows:


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);
}
}


Now the problem is that when I call getMyObject() which is inside the request object jackson returns the nested custom object as a LinkedHashMap. Is there any way in which I specify that T object needs to be returned?. For example: if I sent object of type Customer then Customer should be returned from that List?.

Thanks.

Answer

This is a well-known problem with Java type erasure: T is just a type variable, and you must indicate actual class, usually as Class argument. Without such information, best that can be done is to use bounds; and plain T is roughly same as 'T extends Object'. And Jackson will then bind JSON Objects as Maps.

In this case, tester method needs to have access to Class, and you can construct

JavaType type = mapper.getTypeFactory().
  constructCollectionType(List.class, Foo.class)

and then

List<Foo> list = mapper.readValue(new File("input.json"), type);