2012-05-26 14 views
7

Sto analizzando la risposta dall'API last.fm. Ma sembra che abbiano usato un wrapper per alcune delle risposte, il che sta causando un po 'di dolore. Per porre esempio:Gestione Jackson Elementi avvolti

{ 
    "artists":{ 
     "artist":[ 
     { 
      "name":"Coldplay", 
      "playcount":"816763", 
      "listeners":"120815", 
      "mbid":"cc197bad-dc9c-440d-a5b5-d52ba2e14234", 
      "url":"http:\/\/www.last.fm\/music\/Coldplay", 
      "streamable":"1" 
     }, 
     { 
      "name":"Radiohead", 
      "playcount":"846668", 
      "listeners":"99135", 
      "mbid":"a74b1b7f-71a5-4011-9441-d0b5e4122711", 
      "url":"http:\/\/www.last.fm\/music\/Radiohead", 
      "streamable":"1" 
     } 
     ], 
     "@attr":{ 
     "page":"1", 
     "perPage":"2", 
     "totalPages":"500", 
     "total":"1000" 
     } 
    } 
} 

Non solo la risposta è avvolto negli artisti oggetto, ma l'array dell'oggetto ha anche un involucro oggetto.

Quindi una classe wrapper come:

public class LastFMArtistWrapper { 
    public List<Artist> artists; 

} 

non avrebbe funzionato. Ho lavorato su questo, creando due classi wrapper, ma questo sembra davvero brutto. C'è un modo in cui possiamo usare qualcosa come @XMLElementWrapper in Jackson?

+0

Un vantaggio di questa configurazione è che è estensibile. Se aggiungono più proprietà alla risposta JSON, puoi aggiungerle facilmente ai tuoi oggetti. Tuttavia, se lo si manipola, potrebbe essere necessario annullarlo in un secondo momento se il JSON cambia di nuovo. Potrebbe valere la pena tenere le cose così come sono. Questo è solo il mio suggerimento. Buona fortuna a trovare una risposta. +1 per la domanda. – jmort253

risposta

5

La risposta JSON che si sta restituendo dal provider è una rappresentazione serializzata di una gerarchia di oggetti diversi, ma dalla tua descrizione, sembra che tu abbia davvero bisogno solo di usare e lavorare con un sottoinsieme specifico di questa rappresentazione, collezione di artisti.

Una soluzione per il mirroring di questa rappresentazione prevede la creazione della stessa gerarchia di classi Java, che crea un sovraccarico aggiuntivo sotto forma di classi non necessarie. Da quello che capisco, questo è ciò che desideri evitare.

Il progetto org.json ha creato una classe generica JSONObject, che rappresenta una singola coppia chiave/valore in una rappresentazione JSON più grande. Un oggetto JSONObject può contenere altri JSONObjects e JSONArrays, rispecchiando la rappresentazione senza il sovraccarico aggiuntivo di mantenimento e scrittura di classi aggiuntive.

Pertanto, questi due oggetti possono essere riutilizzati in più livelli di gerarchia in una rappresentazione JSON, senza richiedere la replica della struttura. Ecco un esempio di come si potrebbe procedere:

// jsonText is the string representation of your JSON 
JSONObject jsonObjectWrapper = new JSONObject(jsonText); 

// get the "artists" object 
JSONObject jsonArtists = jsonObjectWrapper.get("artists"); 

// get the array and pass it to Jackson's ObjectMapper, using TypeReference 
    // to deserialize the JSON ArrayList to a Java ArrayList. 
List<Artist> artists = objectMapper.readValue(
     jsonObjectWrapper.getString("artist"), 
      new TypeReference<ArrayList<Artist>>() { }); 

Utilizzando il metodo di cui sopra, si taglia fuori il sovraccarico di dover scrivere livelli aggiuntivi di oggetti POJO che non fanno altro che aggiungere confusione non necessaria.

TestCollectionDeserialization contiene alcuni esempi del metodo readValue quando si lavora con le raccolte e può essere utile.

+0

non c'è alcuna funzione della libreria di jackson per occuparsi di questo? una funzione di Wrapper Ignor sarebbe carina – jiduvah

+0

@jiduvah - Sarebbe bello! Ho guardato, e ho sempre concluso che, a meno che non si abbia bisogno di quel livello di granularità, è più facile usare gli oggetti JSONObject e JSONArray. Se qualcuno creasse un wrapper che forse usasse solo i metadati per serializzare e deserializzare invece di richiedere oggetti reali, sarebbe fantastico! – jmort253

Problemi correlati