2013-07-28 16 views
6

Ho JSON come questo:Jackson JSON parsing contenente un array di oggetti e la matrice di mappe w chiavi/dinamici

{ 

    "users":{ 
      "1234":{ 
       "firstname":"Joe", 
       "lastname":"Smith" 
      }, 
      "9876":{ 
       "firstname":"Bob", 
       "lastname":"Anderson" 
      } 
    }, 
    "jobs":[ 
      { 
       "id":"abc", 
       "location":"store" 
      }, 
      { 
       "id":"def", 
       "location":"factory" 
      } 
    ] 
} 

sto analizzando questa utilizzando Jackson e così mi è stato l'analisi delle risposte utilizzando: readvalue (jSON, MyCustomClass.class)

Dove myCustomClass sembra

public class MyCustomClass{ 
     @JsonProperty("jobs") 
     ArrayList<Job> jobs; 

     @JsonProperty("users") 
     ArrayList<UserMap> usersMap; 
} 

Ora i lavori parsing perfettamente in oggetti lavoro, ma non riesco a ottenere agli utenti di analizzare in quanto hanno le chiavi dinamiche. Ho letto di JsonAnyGetter/Setter e provato a fare la mappa oggetto usermap che associa una stringa -> User come:

public class UserMap { 

private HashMap<String,User> usersMap; 


@JsonAnySetter 
public void add(String key, User user){ 
    usersMap.put(key, user); 
} 

@JsonAnyGetter 
public Map<String, User> getUsersMap(){ 
    return usersMap; 
} 


} 

ma che non funziona. Penso di poterlo fare con un wrapper TypeReference, ma posso solo pensare a un modo per farlo se quelle mappe fossero l'unico tipo che stavo tornando indietro. Dal momento che sto recuperando diversi tipi (utenti e lavori) è possibile farlo?

+0

tuo JSON non è valido. Hai, dopo "Anderson" per esempio –

+0

Scusa che è stato un refuso da parte mia, risolto. Dovrebbe essere valido JSON ora. – pat

risposta

9

Soluzione:

public class MyCustomClass { 
    @JsonProperty("users") 
    public LinkedHashMap<String, User> users; 

    @JsonProperty("jobs") 
    public ArrayList<Job> jobs; 
}  
0

Si potrebbe probabilmente aggirare questo scrivendo il proprio deserializzatore personalizzato e registrarlo con il mappatore oggetto che si sta utilizzando. Questo dovrebbe funzionare in quanto si avrà il controllo completo di come ogni oggetto è deserializzato in un oggetto Utente.

Vedere this jackson documentation su come eseguire il rolling del proprio deserializzatore.

Vorrei anche dire, se si ha il controllo sulla struttura JSON - vorrei cambiare il valore della chiave (che sto indovinando è un ID per l'utente) di essere una parte dell'oggetto reale JSON in contrapposizione ad essere il tasto. Questo ti aiuterà a evitare il problema tutti insieme.

Ad esempio:

"users":{ 
     { 
      "id":"1234", 
      "firstname":"Joe", 
      "lastname":"Smith" 
     }, 
     { 
      "id":"9876", 
      "firstname":"Bob", 
      "lastname":"Anderson" 
     }  
Problemi correlati