Джексон читает json в общем списке
Я использую Джексона, чтобы читать сообщения json. Одним из значений, которые я пытаюсь проанализировать, является List, а другое значение содержит тип данных в списке. Это структура, которую я создал в java.
public class Message<T> {
private Timestamp time;
private RestAction action;
private String type;
private List<T> data;
}
Через Class.forName();
я могу получить класс, который представляет данные в списке. Вопрос в том, как я могу прочитать Список.
Ответы
Ответ 1
Если вам нужно сопоставить входящий json с вашим списком, вы можете сделать это следующим образом:
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
Что-то вроде этого, полностью непроверено и никогда не выполнялось
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;
}
Ответ 2
Что-то намного короче:
mapper.readValue(jsonString, new TypeReference<List<EntryType>>() {});
Ответ 3
Вам необходимо аннотировать свой класс с помощью @JsonDeserialize(using = MessageDeserializer.class)
и реализовать собственный десериализатор:
public class MessageDeserializer extends JsonDeserializer<Message> {
@Override
public Message deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException {
// YOU DESERIALIZER CODE HERE
}
}
@see примеры здесь: Как написать сериализатор и десериализатор Json для Джексона?
Ответ 4
Если вам нужно прочитать json в общем списке,
Сделайте что-то вроде
{
Employee:
[
{
"key": "value",
"key": "value"
},
{
"key": "value",
"key": "value"
}
]
}
ваш объект списка json
а также
ваш bean класс
class person {
private String key;
private String value;
}
теперь вы можете прочитать этот json, используя HashMap
что-то вроде
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);