I’m using Jackson in order to read json messages. One of the values that I’ trying to parse is a List and another value contains the type of the data in the list. This is the structure i ‘ve created in java.
public class Message<T> { private Timestamp time; private RestAction action; private String type; private List<T> data; }
Through Class.forName();
I can get the class which represents the data in the list. The question is how can I read the List.
Advertisement
Answer
If you need to map the incoming json to your List you can do like this
String jsonString = ...; //Your incoming json string ObjectMapper mapper = new ObjectMapper(); Class<?> clz = Class.forName(yourTypeString); JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, clz); List <T> result = mapper.readValue(jsonString, type);
Edit
Something like this, completly untested and never done
public Message<T> 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 <T> data = mapper.readValue(list, listType); Message<T> message = new Message<T>; message.setTime(time); message.setAction(action); message.setType(type); message.setData(data); return message; }