java.lang.ClassCastException: java.util.LinkedHashMap no se puede convertir en com.testing.models.Account

Estoy obteniendo el siguiente error:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.testing.models.Account 

con el código de abajo

 final int expectedId = 1; Test newTest = create(); int expectedResponseCode = Response.SC_OK; ArrayList account = given().when().expect().statusCode(expectedResponseCode) .get("accounts/" + newTest.id() + "/users") .as(ArrayList.class); assertThat(account.get(0).getId()).isEqualTo(expectedId); 

¿Hay alguna razón por la que no puedo hacer get(0) ?

El problema viene de Jackson. Cuando no tiene suficiente información sobre qué clase deserializar, usa LinkedHashMap .

Como no está informando a Jackson sobre el tipo de elemento de su ArrayList , no sabe que desea deserializarlo en una ArrayList of Account . Entonces vuelve al predeterminado.

En su lugar, probablemente podría usar as(JsonNode.class) , y luego tratar con ObjectMapper de una manera más rica de lo que permite el rest de la seguridad. Algo como esto:

 ObjectMapper mapper = new ObjectMapper(); JsonNode accounts = given().when().expect().statusCode(expectedResponseCode) .get("accounts/" + newClub.getOwner().getCustId() + "/clubs") .as(JsonNode.class); //Jackson's use of generics here are completely unsafe, but that's another issue List accountList = mapper.readValue( mapper.treeAsTokens(accounts), new TypeReference>(){} ); assertThat(accountList.get(0).getId()).isEqualTo(expectedId); 

Pruebe lo siguiente:

 POJO pojo = mapper.convertValue(singleObject, POJO.class); 

o:

 List pojos = mapper.convertValue( listOfObjects, new TypeReference>() { }); 

Consulte la conversión de LinkedHashMap para obtener más información.

La forma en que podía mitigar la matriz JSON a la colección de problemas de objetos LinkedHashMap era mediante el uso de CollectionType lugar de una TypeReference . Esto es lo que hice y trabajé :

 public  List jsonArrayToObjectList(String json, Class tClass) throws IOException { ObjectMapper mapper = new ObjectMapper(); CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, tClass); List ts = mapper.readValue(json, listType); LOGGER.debug("class name: {}", ts.get(0).getClass().getName()); return ts; } 

Al usar TypeReference , todavía estaba obteniendo una ArrayList de LinkedHashMaps, es decir , no funciona :

 public  List jsonArrayToObjectList(String json, Class tClass) throws IOException { ObjectMapper mapper = new ObjectMapper(); List ts = mapper.readValue(json, new TypeReference>(){}); LOGGER.debug("class name: {}", ts.get(0).getClass().getName()); return ts; } 

Tuve una excepción similar (pero un problema diferente) – java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.bson.Document y, afortunadamente, se resuelve más fácilmente:

En lugar de

 List docs = obj.get("documents"); Document doc = docs.get(0) 

que da error en la segunda línea, uno puede usar

 List docs = obj.get("documents"); Document doc = new Document(docs.get(0)); 
    Intereting Posts