2016-08-16 2 views
0

J'ai passé en revue certains des articles, mais je n'ai pas trouvé de solution appropriée à mon problème. Je suis en train de sérialiser/désérialiser un HashMap<String, Object>. Ici, la valeur de la carte de hachage peut quelque chose? Lorsque j'ajoute une classe appelée "JobData" à Map pour sérialiser/désérialiser, je rencontre des problèmes lorsque je désérialise objectMapper.Deserialize Variable de type générique en tant que clé de la carte avec l'analyseur Jackson

est Ci-dessous l'exemple de code

public class JobData { 

    private FinalResult finalResult; 

    public FinalResult getFinalResult(){ 
     return finalResult; 
    } 

    public void setFinalResult(FinalResult finalResult) { 
     this.finalResult = finalResult; 
    } 
} 

public class FinalResult<T> { 

    private Map<T, Exception> exceptionMap; 

    public HashMap<T, Exception> getFailedExceptionMap(){ 
    return exceptionMap; 
    } 

    public void setFailedExceptionMap(Map<T, Exception> map){ 
    exceptionMap = map; 
    } 
} 

    Map<String, Object> data = new HashMap<String, Object>(); 
    JobData jobdata = new JobData(); 
    FinalResult result = new FinalResult(); 

    Map<Integer, Exception> exceptionMap = new HashMap<Integer, Exception>(); 
    exceptionMap.put(new Integer("1233456"), new Exception("MY_ERROR", "TESTING ERROR")); 
    result.setFailedExceptionMap(exceptionMap); 
    exportJobdata.setFinalResult(result); 

    data.put("JOB_DATA", jobdata); 

    ............... 

    //Serialization 
    mapper.writerWithType(HashMap.class).writeValue(arg1, arg0); 

    ................. 

    //Deserialize 
    HashMap<String, Object> map = mapper.readValue(in, new TypeReference<HashMap<String, Object>>() 

Certains des liens suggèrent d'utiliser TypeFactory pour les types génériques? Mais pas clair sur la façon d'utiliser cela?

sérialisation fonctionne très bien, mais je reçois une erreur lorsque vous essayez de désérialiser

com.fasterxml.jackson.databind.JsonMappingException: jeton inattendu (START_OBJECT), prévu START_ARRAY: besoin JSON tableau pour contenir As.WRAPPER_ARRAY tapez les informations pour la classe java.util.Map à [Source: [email protected]; ligne: 1, colonne: 1251] (à travers chaîne de référence: java.util.HashMap ["JOB_DATA"] -> com.sample.JobData ["finalResult"] -> com.sample.FinalResult ["failedExceptionMap"]) à com.fasterxml.jackson.databind.JsonMappingException.from (JsonMappingException.java:261)

+0

deux commentaires - d'abord, votre exemple de code ne compilera pas - il n'y a pas cteur pour exception qui prend deux cordes args, et le type de retour de 'getFailedExceptionMap()' ne correspond pas au type de valeur de retour –

+0

deuxièmement, l'utilisation de génériques ne s'applique pas à toutes les définitions de variables, je veux dire que la classe 'JobData' devrait également être paramétrée avec' 'et appliquer ce paramètre générique à toutes les références de 'FinalResult' –

+0

puis, lorsque tous les types génériques sont d correctement défini, il est facile d'utiliser 'TypeFactory' pour informer Jackson des types génériques –

Répondre

0

ne peut pas reproduire. Ce code a parfaitement fonctionné (jackson 2.8.0)

public static void main(String[] args) 
{ 
    Map<String, Object> data = new HashMap<String, Object>(); 
    JobData jobdata = new JobData(); 
    FinalResult<Integer> result = new FinalResult<>(); 
    Map<Integer, Exception> exceptionMap = new HashMap<Integer, Exception>(); 
    exceptionMap.put(new Integer("1233456"), new Exception("MY_ERROR")); 
    result.setFailedExceptionMap(exceptionMap); 
    jobdata.setFinalResult(result); 
    data.put("JOB_DATA", jobdata); 

    ObjectMapper mapper = new ObjectMapper(); 
    try { 
     ByteArrayOutputStream os = new ByteArrayOutputStream(); 
     mapper.writerFor(HashMap.class).writeValue(os, data); 
     InputStream is = new ByteArrayInputStream(os.toByteArray()); 
     HashMap<String, Object> map = mapper.readValue(is, new TypeReference<HashMap<String, Object>>(){}); 
     System.out.println(map); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

sortie

{JOB_DATA={finalResult={failedExceptionMap={1233456={cause=null, stackTrace=[{methodName=main, fileName=JSONTest.java, lineNumber=36, className=test.JSONTest, nativeMethod=false}], localizedMessage=MY_ERROR, message=MY_ERROR, suppressed=[]}}}}}