2013-01-31 17 views
5

mio controller restituisce un elenco di oggetti myObj (utilizzando @ResponseBody)Jackson - Avvolgere un elenco di oggetti con oggetto radice

public MyObj 
{ 
    int a; 
    int b; 
} 

Il ritorno JSON è simile al seguente:

[{"a":1,"b":2},{"a":2,"b":2}] 

vorrei per avvolgere questo JSON in modo che restituirà qualcosa come:

{ "data": [{"a":1,"b":2},{"a":2,"b":2}]} 

da quello che ho letto ho bisogno di abilitare SerializationCon fig.Feature.WRAP_ROOT_VALUE o (?) utilizzare @JsonRootName ("data") nella parte superiore del mio controller.

Anche provato @XmlRootElement, niente sembra funzionare. Qualche idea su quale sia il modo giusto per avvolgere l'elenco di oggetti con un nome radice?

+1

Hai mai capito come farlo? Ho scoperto un modo per creare una mappa di elenchi e quindi far funzionare ObjectMapper, ma non è così elegante. Sto pensando che c'è un modo migliore per farlo. L'hai capito? – Seagull

risposta

6

Sembra che stai parlando di inserire @JsonRootName nell'elenco piuttosto che l'oggetto, il che non comporterà ciò che stai cercando di fare.

Se si desidera utilizzare @JsonRootName si vorrà consentire SerializationFeature.WRAP_ROOT_VALUE come lei ha citato sopra e aggiungere l'annotazione alla classe:

@JsonRootName("data") 
public MyObj { 
    int a; 
    int b; 
} 

Ciò avvolgere gli oggetti stessi, non la lista:

{ 
    "listName": [ 
     { 
      "data": {"a":1, "b":2} 
     }, 
     { 
      "data": {"a":2, "b":2} 
     } 
    ] 
} 

Se si vuole avvolgere la lista in un oggetto, magari creando un involucro oggetto generico è la soluzione migliore. Questo può essere realizzato con una classe come questa:

public final class JsonObjectWrapper { 
    private JsonObjectWrapper() {} 

    public static <E> Map<String, E> withLabel(String label, E wrappedObject) { 
     return Collections.singletonMap(label, wrappedObject); 
    } 
} 

Poi, prima di inviare la vostra lista indietro con la risposta, basta avvolgerlo in JsonObjectWrapper.withLabel("data", list) e Jackson si prende cura di tutto il resto.

+0

Forse Collections.singletonMap (label, wrappedObject) sarebbe più efficiente e consise? –

+0

Ottimo suggerimento @charlie_pl! Aggiornato il post. –

Problemi correlati