2013-07-31 3 views
16

Я использую Джексон, чтобы читать сообщения json. Одним из значений, которые я пытаюсь проанализировать, является List, а другое значение содержит тип данных в списке. Это структура, которую я создал в java.Джексон читает json в общем списке

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

Через Class.forName(); я могу получить класс, который представляет данные в списке. Вопрос в том, как я могу прочитать Список.

+0

Можете ли вы показать нам ваш пример JSON строки и исходный код, который вы уже написали? Я думаю, вы также можете увидеть этот вопрос: http://stackoverflow.com/questions/17605524/jackson-delay-deserializing-field/17625688 –

+0

Если вы не возражаете, пожалуйста, отметьте мой ответ, который получил большую часть баллов как действительный один. Он компактен и делает именно то, что вам нужно. – splatch

ответ

25

Если необходимо отобразить входящий 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); 

Редактировать

Что-то вроде этого, укомплектовать непроверенных и никогда не делали

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; 
} 
+0

Хорошо ... Я уже пытался решить это так, но проблема в том, что в сообщении json есть другие поля в дополнение к списку. – Lalao

+0

К сожалению, я не понял ваш вопрос. Затем вам нужно создать десериализатор, например, seralex.vi. Вы можете использовать что-то вроде этого внутри, чтобы десериализовать Список – alex

+0

Отредактированный мой ответ, сообщите мне, если это сработает, мне, вероятно, придется сделать что-то подобное в ближайшее время – alex

2

Вы должны аннотировать класс с @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 здесь: How Do I Write a Jackson JSON Serializer & Deserializer?

49

Something, который намного короче:

mapper.readValue(jsonString, new TypeReference<List<EntryType>>() {}); 
+0

Это работает. Также попробуйте это: Итератор it = mapper.reader (Objects.class) .readValues ​​(in); –

+0

Откуда появляется Objects.class? – splatch

+0

Он относится к типу, который находится в списке (EntryType на вашем примере) –

-1

Если вам нужно читать 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); 
Смежные вопросы