util readvalue objects convert cast cannot array java generics jackson generic-list linkedhashmap

readvalue - Jackson JSON+Java Generics consigue LinkedHashMap



objectmapper array of objects (1)

Los siguientes trabajos y según los consejos de StaxMan ya no usan el método de tipo de collectionType() estático en desuso.

public class SoApp { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { System.out.println("Hello World!"); String s = "[{/"user/":/"TestCity/",/"role/":/"TestCountry/"},{/"user/":/"TestCity/",/"role/":/"TestCountry/"}]"; StringReader sr = new StringReader("{/"user/":/"TestCity/",/"role/":/"TestCountry/"}"); //UserRole user = mapper.readValue(sr, UserRole.class); mapJsonToObjectList(new UserRole(),s,UserRole.class); } protected static <T> List<T> mapJsonToObjectList(T typeDef,String json,Class clazz) throws Exception { List<T> list; ObjectMapper mapper = new ObjectMapper(); System.out.println(json); TypeFactory t = TypeFactory.defaultInstance(); list = mapper.readValue(json, t.constructCollectionType(ArrayList.class,clazz)); System.out.println(list); System.out.println(list.get(0).getClass()); return list; } }

...

public class UserRole{ private String user; private String role; public void setUser(String user) { this.user = user; } public void setRole(String role) { this.role = role; } public String getUser() { return user; } public String getRole() { return role; } @Override public String toString() { return "UserRole [user=" + user + ", role=" + role + "]"; } }

salida...

Hello World! [{"user":"TestCity","role":"TestCountry"},{"user":"TestCity","role":"TestCountry"}] [UserRole [user=TestCity, role=TestCountry], UserRole [user=TestCity, role=TestCountry]] class com.test.so.fix.UserRole

Tengo una pregunta que es similar a algunas preguntas en stackoverflow pero ninguna realmente responde a mi problema. Utilizo el ObjectMapper de Jackson y quiero analizar esta cadena JSON en una lista de objetos de usuario:

[{ "user" : "Tom", "role" : "READER" }, { "user" : "Agnes", "role" : "MEMBER" }]

Yo defino una clase interna como esta:

public class UserRole { private String user private String role; public void setUser(String user) { this.user = user; } public void setRole(String role) { this.role = role; } public String getUser() { return user; } public String getRole() { return role; } }

Para analizar la cadena JSON en una lista de UserRoles de UserRoles , uso genéricos:

protected <T> List<T> mapJsonToObjectList(String json) throws Exception { List<T> list; try { list = mapper.readValue(json, new TypeReference<List<T>>() {}); } catch (Exception e) { throw new Exception("was not able to parse json"); } return list; }

Pero lo que obtengo es una List de LinkedHashMaps .

¿Qué está mal con mi código?