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
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;
}
Something which is much shorter:
mapper.readValue(jsonString, new TypeReference<List<EntryType>>() {});
You need to annotate your class with @JsonDeserialize(using = MessageDeserializer.class)
and implement custom deserializer:
public class MessageDeserializer extends JsonDeserializer<Message> {
@Override
public Message deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
// YOU DESERIALIZER CODE HERE
}
}
@see examples here: How Do I Write a Jackson JSON Serializer & Deserializer?
If you need to read json in generic List, Do something like
{
Employee:
[
{
"key": "value",
"key": "value"
},
{
"key": "value",
"key": "value"
}
]
}
your json list object and your bean class is
class person {
private String key;
private String value;
}
now you can read this json using HashMap
something like
TypeReference<HashMap<String,List<Person>>> personList = new TypeReference<HashMap<String, List<Person>>>() {};
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
HashMap<String, List<Person>> employees = objectMapper.readValue(request.getInputStream(), personList);