2011-01-07 10 views
22

Sto avendo un problema serializzazione di un oggetto utilizzando GSON.serial GSON POJO con valore root incluso?

@XmlRootElement 
class Foo implements Serializable { 
    private int number; 
    private String str; 

    public Foo() { 
     number = 10; 
     str = "hello"; 
    } 
} 

GSON serializzare questo in un JSON

{"number":10,"str":"hello"}.

Tuttavia, voglio che sia

{"Foo":{"number":10,"str":"hello"}},

in modo sostanzialmente compreso l'elemento di livello superiore. Ho provato a google un modo per farlo a Gson, ma senza fortuna. Qualcuno sa se c'è un modo per raggiungere questo obiettivo?

Grazie!

risposta

19

è necessario aggiungere l'elemento in cima all'albero dell'oggetto. Qualcosa di simile a questo:

Gson gson = new Gson(); 
JsonElement je = gson.toJsonTree(new Foo()); 
JsonObject jo = new JsonObject(); 
jo.add("Foo", je); 
System.out.println(jo.toString()); 
// Prints {"Foo":{"number":10,"str":"hello"}} 
+2

bene, questo significa che ho bisogno per esempio inserire il codice di classe "Foo" nell'elemento. – fei

+0

@fei sì. Idealmente, quello che stai ricevendo da Gson è corretto. La corretta rappresentazione dell'oggetto 'Foo' in JSON è' {"numero": 10, "str": "ciao"} '. Se c'è una classe che ha Foo come variabile di istanza in quel caso, dovresti aspettarti "{" pippo ": {" numero ": 10," str ":" ciao "}}' - ma se vuoi anteporre nome della classe esplicitamente, dovrai aggiungerlo esplicitamente. – Nishant

15

Invece di hardcoding tipo si può fare:

... 
jo.add(Foo.getClass().getSimpleName(), je); 
+2

Penso che questo dovrebbe essere un commento dell'altra risposta e non una risposta da sola. In realtà è un buon commento anche se – mbritto

-1

Se si utilizza Jackson api utilizzare le linee sotto

mapper.configure (SerializationFeature.WRAP_ROOT_VALUE, vero); mapper.configure (DeserializationFeature.UNWRAP_ROOT_VALUE, true);

+0

Il titolo dell'opzione dello stato della domanda sta usando GSON e non Jackson – dstarh

6

Un modo migliore per fare questo è quello di creare una classe involucro e quindi creare un oggetto di Foo suo interno.

codice di esempio:

public class ResponseWrapper { 

    @SerializedName("Foo") 
    private Foo foo; 

    public Foo getFoo() { 
     return foo; 
    } 

    public void setFoo(Foo foo) { 
     this.foo= foo; 
    } 
} 

Allora si può facilmente analizzare a JSON utilizzando:

new GsonBuilder().create().toJson(responseWrapperObj); 

che vi darà la struttura desiderata:

{"Foo":{"number":10,"str":"hello"}} 
+0

Questa è una risposta molto migliore. –

+0

Non proprio, si sta creando un altro oggetto ... in una piccola applicazione con 3 modelli questo è ok, ma mantengono 40+ e scrivere questi wrapper ... –