2016-07-14 1 views
1

-je utiliser jackson-databind 2.8.0 je objet avec des données génériquesComment désérialiser JSON complexe POJO <> avec Liste des objets génériques

public class JsonItem<T> implements Serializable { 

    private static final long serialVersionUID = -8435937749132073097L; 

    @JsonProperty(required = true) 
    private boolean success; 

    @JsonProperty(required = false) 
    private T data; 

    @JsonProperty(required = false) 
    private Map<String, String> errors = new HashMap<>(); 

    JsonItem() { 
    } 

    public boolean getSuccess() { 
     return success; 
    } 

    public void setSuccess(boolean success) { 
     this.success = success; 
    } 

    public T getData() { 
     return data; 
    } 

    public void setData(T data) { 
     this.data = data; 
    } 

    public Map<String, String> getErrors() { 
     return errors; 
    } 

    public void setErrors(Map<String, String> errors) { 
     this.errors = errors; 
    } 
    } 

et ont l'objet

@JsonInclude(JsonInclude.Include.NON_EMPTY) 
public class DepositInfoDto implements Serializable { 

    private static final long serialVersionUID = -4123441934244992311L; 

    @NotNull 
    @JsonProperty(required = true) 
    private String productName; 

    @NotNull 
    @JsonProperty(required = true) 
    private String contractName; 

    @NotNull 
    @JsonProperty(required = true) 
    private List<ContractDto> contracts; 

    @NotNull 
    @JsonProperty(required = true) 
    private StatusDto status; 
//...getters and setters 
} 

I Recevied objet comme JsonItem<List<DepositInfoDto>> .

J'essaie de créer méthode universelle pour deserealize

public <T> List<T> getObjects(){ 
     ObjectMapper mapper = new ObjectMapper(); 
     List<T> myObjects = mapper.readValue(jsonInput, new TypeReference<JsonItem<List<T>>(){}); 
    return myObjects; 
    } 

travail parce T jeté à l'objet dans l'exécution

public List<DepositInfoDto> getObjects(){ 
     ObjectMapper mapper = new ObjectMapper(); 
     List<DepositInfoDto> myObjects = mapper.readValue(jsonInput, new TypeReference<JsonItem<List<DepositInfoDto >>(){}); 
    return myObjects; 
    } 

travail, mais je veux méthode universelle parce que j'ai DepositInfoDto, CardinfoDto, ContractDto etc.

Je vois la méthode

public List<T> getObjects(Class<T> clazz){ 
     ObjectMapper mapper = new ObjectMapper(); 
     List<T> myObjects = mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(List.class, clazz)); 
    return myObjects; 
    } 

mais ne fonctionne pas parce que j'ai JsonItem avec des données List<T>

Comment puis-je résoudre ce problème? Peut-être ont mapper.getTypeFactory() méthode complexe comme mapper.getTypeFactory().constructType(JsonItem.class, List.class,DepositInfoDto.class)

EDIT

Dans mon cas

ObjectMapper mapper = new ObjectMapper(); 
        try { 
         JsonItem<T> item = mapper.readValue(objectWrapper.get(0), mapper.getTypeFactory().constructParametricType(
           JsonItem.class, mapper.getTypeFactory().constructCollectionType(List.class, resourceClass))); 
         return item.getData(); 
        } catch (IOException e) { 
         LOG.error("Can't deserialize JSON to class: "+ resourceClass +". Error: " + e); 
         Thread.currentThread().interrupt(); 
        } 

Répondre

1

Vous pouvez utiliser TypeFactory#constructParametricType pour créer un JavaType pour JsonItem<T> puis utilisez TypeFactory#constructCollectionType pour créer CollectionType pour List<JsonItem<T>>. Voici l'exemple:

public <T> List<JsonItem<T>> getObjects(String jsonInput, Class<T> clazz) { 

    ObjectMapper mapper = new ObjectMapper(); 
    return mapper.readValue(jsonInput, mapper.getTypeFactory().constructCollectionType(
      List.class, mapper.getTypeFactory().constructParametricType(JsonItem.class, clazz))); 
}