Jackson read json in generic List

后端 未结 4 781
旧时难觅i
旧时难觅i 2020-12-24 13:36

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

相关标签:
4条回答
  • 2020-12-24 13:41

    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;
    }
    
    0 讨论(0)
  • 2020-12-24 13:50

    Something which is much shorter:

    mapper.readValue(jsonString, new TypeReference<List<EntryType>>() {});
    
    0 讨论(0)
  • 2020-12-24 14:01

    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?

    0 讨论(0)
  • 2020-12-24 14:06

    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);
    
    0 讨论(0)
提交回复
热议问题