2013-06-25 11 views
15

Sto provando a creare il tipo di classe interna per un oggetto passato come JSON ma mentre ho letto tonnellate qui e il sito di Jackson non sembra essere in grado di ottenere il giusta combinazione quindi se qualcun altro ha dei suggerimenti sarebbe molto apprezzato. Ho postato alcuni frammenti di seguito e rimosso tutti i getter e setter, non ho capito che avevano bisogno di postare. Sto usando Jackson 2.2.Jackson Json Type Mapping Inner Class

Le classi che sto tentando di deserializzare:

public class Settings { 
    private int offset; 
    private int limit; 
    private String type; 
    private Map<String, Criteria> criteria; 

    public class Criteria { 
    private String restriction; 
    private Object value; 
    } 
} 

Il codice che sto usando per deserializzare:

ObjectMapper om = new ObjectMapper(); 
TypeFactory tf = om.getTypeFactory(); 
JavaType map = tf.constructMapLikeType(Map.class, String.class, Criteria.class); 
JavaType type = typeFactory.constructType(Settings.class, map); 
Settings settings = om.readValue(entity, type); 

miei dati di test JSON:

{ "type": "org.json.Car", "criteria": { "restriction": "eq", "value": "bmw" } } 
+1

La classe interna deve essere statica. Vedi http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html – Paul

+0

Quando seguo queste istruzioni ottengo l'errore: "Il tipo di membro [nome classe] non può essere dichiarato statico, i tipi statici possono essere solo dichiarato in tipi statici o di primo livello " – coltonfranco

+0

Fai riferimento a questo post del blog per maggiori informazioni sulle classi di nidificazione e jackson. La serializzazione funziona bene, ma la deserializzazione non avverrà a meno che la classe non sia di tipo statico annidato - http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html – testerjoe2

risposta

4

Se può, quindi semplificare la vita e spostare la classe interna in una classe normale con un riferimento nella classe Impostazioni. E poi fare lo smistamento con Jackson, ecco come si può avere le vostre classi:

public class Settings { 
    private int offset; 
    private int limit; 
    private String type; 
    private Map<String, Criteria> criteria; 
    private Criteria criteria; 
} 


class Criteria { 
    private String restriction; 
    private Object value; 
    } 
+0

È stata davvero la classe interna a causare tutto il problema. – ars265

+3

Oppure usare 'static' –

33

La risposta corretta è che ti manca la parola chiave statica sulla classe interna.

Assicurati solo che la parola chiave "statica" sia presente.

Leggi http://www.cowtowncoder.com/blog/archives/2010/08/entry_411.html

ci vogliono 3 minuti, ma ti fanno felice per il resto della giornata.

+1

Questa dovrebbe essere la risposta accettata. –

+0

redochka - Come decidiamo se usare la classe nidificata statica (il tuo anwser) o semplicemente la composizione (risposta ahsan juned)? – testerjoe2

+0

@ testerjoe2 è una questione di scelta personale. Io uso una classe statica nidificata quando so che non verrà utilizzata altrove perché è strettamente correlata alla classe di hosting. Se ho intenzione di usare questa classe altrove, la metto in una classe separata di sicuro. – redochka

Problemi correlati