Jackson leu json na lista genérica

Estou usando o Jackson para ler as mensagens do json. Um dos valores que estou tentando analisar é uma List e outro valor contém o tipo de dados na lista. Esta é a estrutura que criei em java.

public class Message { private Timestamp time; private RestAction action; private String type; private List data; } 

Através de Class.forName(); Eu posso pegar a class que representa os dados na lista. A questão é como posso ler a lista.

Se você precisa mapear o json de input para sua lista, você pode fazer como este

 String jsonString = ...; //Your incoming json string ObjectMapper mapper = new ObjectMapper(); Class clz = Class.forName(yourTypeString); JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, clz); List  result = mapper.readValue(jsonString, type); 

Editar

Algo assim, completamente não testado e nunca feito

 public Message deserialize(JsonParser jsonParser, DeserializationContext arg1) throws IOException, JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); ObjectCodec oc = jsonParser.getCodec(); JsonNode node = oc.readTree(jsonParser); JsonNode timeStamp = node.get("time"); Timestamp time = mapper.readValue(timeStamp, Timestamp.class); JsonNode restAction = node.get("action"); RestAction action = mapper.readValue(restAction, RestAction.class); String type = node.get("type").getTextValue(); Class clz = Class.forName(type); JsonNode list = node.get("data"); JavaType listType = mapper.getTypeFactory().constructCollectionType(List.class, clz); List  data = mapper.readValue(list, listType); Message message = new Message; message.setTime(time); message.setAction(action); message.setType(type); message.setData(data); return message; } 

Algo que é muito mais curto:

 mapper.readValue(jsonString, new TypeReference>() {}); 

Você precisa anotar sua class com @JsonDeserialize(using = MessageDeserializer.class) e implementar o desserializador customizado:

 public class MessageDeserializer extends JsonDeserializer { @Override public Message deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException { // YOU DESERIALIZER CODE HERE } } 

@ Veja exemplos aqui: Como faço para escrever um Jackson JSON Serializer & Desserializer?

Se você precisa ler json na Lista genérica, faça algo como

 { Employee: [ { "key": "value", "key": "value" }, { "key": "value", "key": "value" } ] } 

seu object de lista json e sua class de bean é

 class person { private String key; private String value; } 

agora você pode ler este json usando o HashMap

algo como

 TypeReference>> personList = new TypeReference>>() {}; ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); HashMap> employees = objectMapper.readValue(request.getInputStream(), personList);