2017-08-26 4 views
0

J'ai json champ s comme ci-dessous. Comment puis-je le désérialiser en String, String Map?java jackson désérialisation avec différents types d'objets imbriqués

s:{ 
    "g":0.0, 
    "p":0.0, 
    "m":0.0, 
    "media":{ 
     "1":{"key":0,"value":0}, 
     "2":{"key":0,"value":0}, 
     "3":{"key":0,"value":0}, 
     "4":{"key":0,"value":0}, 
     ...}, 
    "pr":{ 
     "1":{"key":0,"value":0}, 
     "2":{"key":0,"value":0}, 
     "3":{"key":0,"value":0}, 
    ...} 
    } 

J'ai essayé comme ça

 public JsonNode s; 
     @JsonGetter("s") 
     public Map<String,String> getS() { 
      if (s == null) { 
       return null; 
      } 
      ObjectMapper mapper = new ObjectMapper(); 
      Map<String, Object> map; 
      map = mapper.convertValue(score, new TypeReference<Map<String, Object>>(){}); 
      Map<String,String> result; 
      for (Map.Entry<String, Object> entry : map.entrySet()) { 
       if(entry.getValue() instanceof String){ 
        result.put(entry.getKey(), (String) entry.getValue()); 
       } 
      } 
      return result; 
     } 

et c'est un travail pour le test, mais je reçois l'erreur suivante pour des données réelles

ne peut désérialiser instance de java.lang.String sur de START_OBJECT jeton à [Source: UNKNOWN; ligne: -1, colonne: -1] (par référence chaîne : java.util.LinkedHashMap [ "media"])

Toute suggestion?

Répondre

0

Selon le modèle

@JsonGetter("s") 
public Map<String,String> getS() 

s est un Map<String,String> mais le media JSON semble être un Object à la place (probablement Map<String, Map<String,String>>)

"media":{ 
    "1":{"key":0,"value":0}, 
    "2":{"key":0,"value":0}, 
    "3":{"key":0,"value":0}, 
    "4":{"key":0,"value":0}, 
...}, 

vous devriez probablement utiliser

@JsonGetter("s") 
public Map<String,Object> getS() 

et le n cast l'objet plus loin.

+0

Quelle est la différence avec ma tentative? Je tout d'abord converti en carte et puis à la carte . Comment devrais-je le mettre dans votre proposition? – Sergei

+0

@Sergei 's' n'est pas un' Map 'en outre il y a 3 niveau d'imbrication pour obtenir la valeur clé dans' media' – nullpointer

+0

Résolu comme ceci pour (Entrée Map.Entry : map .entrySet()) { result.put (entrée.getKey(), entrée.getValue(). toString()); } – Sergei

0

Je l'ai résolu comme ci-dessous

for (Map.Entry<String, Object> entry : map.entrySet()) {  
     result.put(entry.getKey(), entry.getValue().toString()); 
     }