2013-08-04 9 views
13

Ho un fagiolo come questoCome scartare e serializzare la java map in java usando jackson?

class Foo { 
    private Map<String, Data> dataMap; 
    private String fooFieldOne; 
    private String fooFieldTwo; 
} 

class Data { 
    private fieldOne; 
    private fieldTwo; 
} 

voglio serializzare come JSON come come questo

{ 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    }, 
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
} 

Ma io sono sempre risultato simile

{ 
    "dataMap": { 
     "key1": { 
      "fieldOne": "some value", 
      "fieldTwo": "some value" 
     }, 
     "key2": { 
      "fieldOne": "some other value", 
      "fieldTwo": "some other value" 
     } 
    }, 
    "fooFieldOne":"valueone", 
    "fooFieldTwo":"valuetwo" 
} 

Come ignorare strato Datamap in il suddetto json? Sto usando la libreria java jackson per questo.

codice che ho provato è

ObjectMapper mapper = new ObjectMapper(); 
mapper.writeValueAsString(myFOOObject) 

risposta

10

Si potrebbe creare un getter per Datamap e serializzare l'Datamap anziché l'intero Foo istanza.

mapper.writeValueAsString(myFOOObject.getDataMap()); 

Un altro metodo utilizza l'annotazione @JsonUnwrapped. Questa annotazione è disponibile in Jackson 1.9+.

http://jackson.codehaus.org/1.9.9/javadoc/org/codehaus/jackson/annotate/JsonUnwrapped.html

Lo svantaggio di usare questa annotazione è l'incapacità di utilizzare le mappe come dichiarato nella answer to your other question

+0

Ciao Bart, grazie mille per la tua risposta dettagliata. Ma ho anche altri campi nel mio fagiolo. Prendi in considerazione che Foo ha altri campi per fooFieldOne, fooFieldTwo e la mappa che ho già. Voglio serializzare tutto come oggetto singolo come {"key1": {"fieldOne": "some value", "fieldTwo": "some value"}, "key2": {"fieldOne": "some other value", " fieldTwo ":" qualche altro valore "}," fooFieldOne ":" valueone "," fooFieldTwo ":" valuetwo "}. Come posso gestire questo? – suren

+0

Ho aggiornato la mia risposta per includere l'annotazione @JsonUnwrapped. – Bart

2

Hai trovato

{ "dataMap": ... } 

perché Foo ha un campo chiamato dataMap all'interno di esso. Ecco il nome del campo non può essere ignorato perché creerà risulta in conflitto se Foo avuto più mappe, qualcosa come

class Foo { 
private Map<String, Data> dataMap1; 
private Map<String, Data> dataMap2; 
} 

ora senza avere il fieldName: in JSON, il JSON non sa come deserializzare quando la situazione è un po 'come JSON

{ 
    //belongs to dataMap1 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    //belongs to dataMap2 
    "key3": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key4": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    } 
} 

Ora avendo il nomeCampo rende molto chiaro durante la deserializzazione

{ 
    "dataMap1" : { 
    "key1": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key2": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    } 
    }, 
    "dataMap2" : { 
    "key3": { 
     "fieldOne": "some value", 
     "fieldTwo": "some value" 
    }, 
    "key4": { 
     "fieldOne": "some other value", 
     "fieldTwo": "some other value" 
    } 
    } 
} 

Detto questo

Come ignorare strato Datamap in JSON?

Si può solo serializzare la mappa

ObjectMapper mapper = new ObjectMapper(); 
mapper.writeValueAsString(myFOOObject.getDataMap()); 
+0

Grazie mille per la tua risposta dettagliata. Posso capire cosa sta succedendo nel mio caso. Ma ho altri campi nel mio fagiolo. Prendi in considerazione che Foo ha altri campi per fooFieldOne, fooFieldTwo e la mappa che ho. Voglio serializzare tutto come oggetto unico come { "key1": { "FieldOne": "un certo valore", "fieldTwo": "un certo valore" }, "key2": { "FieldOne": " qualche altro valore ", " fieldTwo ":" qualche altro valore " }," fooFieldOne ":" valueone "," fooFieldTwo ":" valuetwo " }. Come posso gestire questo? – suren

+0

Penso che non sia possibile perché il campo della mappa avrà sempre un nome (non possiamo avere un campo senza nome) e sarà sicuramente catturato in JSON – sanbhat

+0

@sanbhat È possibile usare '@ JsonUnwrapped'. – Bart

0

In mappa ci sono due oggetti String e Data. JSON converte gli oggetti java in coppie di valori chiave JSON, ma se hai già una mappa che contiene coppie di valori chiave e converti la mappa in documento JSON, anche la chiave map viene convertita in coppia di valori chiave JSON e il valore Map ha anche un oggetto che converte in coppia di valori chiave.

0

ho trovato risposta - usando @JsonAnyGetter annotazioni con getter per la mappa. Per evitare conflitti durante la deserializzazione dovrebbe essere usata l'annotazione @JsonAnySetter con setter per questa mappa.

Problemi correlati