Domanda

Sto cercando di analizzare una struttura JSON simile a questo:

    {
 "cars": {
  "112": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1998"
  },
  "642": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1990"
  },
  "9242": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "2001"
  }
 }}

Ho una classe CarEntity definita con makeName, modello, anno attributi definiti e accessibili tramite setter / getter.

Sto cercando di deserializzare questo JSON in questo modo:

    Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json);

e non funziona :( Non deserializzare, ma non in Map<String, CarEntity>, ma piuttosto in una profonda Mappa (qualcosa come Map<String, Map<String, Map<String, String>>>)

Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

Non Sei problema è il tuo JSON ha due mappe. Uno che contiene la chiave 'auto', e uno che contiene il CarEntity reale. Purtroppo, non è possibile fare riferimento a una singola chiave all'interno di un programma e di tipi assegnare solo su quel tasto in questo momento. l'impostazione generale tipi di valori per le raccolte si riferisce a tutti i valori all'interno della raccolta. Non è necessario specificare i tipi per la prima mappa che contiene il tasto "auto", dal momento che sarà deserializzare di default.

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String,Map<String, CarEntity>>>()
    .use("values.values", CarEntity.class )
    .deserialize(json).get("cars");

I 'values.values' Percorso si riferisce ai valori esterni della mappa poi che attraversano i valori seguente mappa sono tutte le istanze CarEntity.

Ho considerato cambiando le espressioni di percorso per essere più espressivo che consente di indirizzare un singolo valore in una raccolta, ma questo aumenta overhead di valutare loro e di essere compatibile è una sfida.

Altri suggerimenti

È più probabile essere stato morso da Java Tipo Erasure: biblioteca JSON in questione non sa tipo che si desidera; tutto ciò che vede è equivalente di Map. Quindi è necessario specificare almeno tipo di valore in qualche modo. Speriamo FlexJSON punti di documentazione come.

In alternativa si può essere in grado di sottoclasse HashMap nella propria tipologia (MyEntityMap estende HashMap), da allora digitare le informazioni si può dedurre dal generico tipo eccellente; e passando MyEntityMap.class darebbe informazioni sul tipo che la maggior parte le biblioteche possono utilizzare JSON (Jackson e GSON almeno).

Se questi non funzionano, Jackson e GSON librerie in grado di gestire questo caso d'uso facilmente; entrambi hanno metodi per specificare i tipi generici per la deserializzazione.

Basta aggiungere un altro chiamata a get("cars") come:

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json).get("cars");

stringa JSON è stato probabilmente serializzato da un cars variabile di tipo Map<String, CarEntity>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top