5

My-Controller gibt eine Liste von MyObj Objekte (mit @ResponseBody)Jackson - Geschenk eine Liste von Objekten mit Wurzelobjekt

public MyObj 
{ 
    int a; 
    int b; 
} 

Die Rückkehr JSON wie folgt aussieht:

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

würde Ich mag Um diesen JSON so zu verpacken, dass er so etwas wie folgt zurückgibt:

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

Von was ich gelesen habe, muss ich SerializationCon aktivieren fig.Feature.WRAP_ROOT_VALUE oder (?) benutze @JsonRootName ("data") auf meinem Controller.

Probieren Sie auch das @ XmlRootElement, nichts scheint zu funktionieren. Irgendeine Idee, was ist der richtige Weg, um die Liste der Objekte mit einem Stammnamen zu umhüllen?

+1

Haben Sie jemals herausgefunden, wie das geht? Ich habe eine Runde um den Weg herum gemacht, indem ich eine Liste von Listen erstellt habe und dann ObjectMapper seine Sache machen ließ, aber das ist nicht so elegant. Ich denke, es gibt einen besseren Weg, dies zu tun. Hast du es herausgefunden? – Seagull

Antwort

6

Es klingt, als ob Sie sprechen über @JsonRootName auf der Liste und nicht das Objekt, die nicht erreichen, was Sie versuchen zu tun.

Wenn Sie @JsonRootName verwenden möchten möchten Sie SerializationFeature.WRAP_ROOT_VALUE ermöglichen, wie Sie die Anmerkung zur Klasse oben, und fügen Sie erwähnt:

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

Dies wird die Objekte selbst wickeln, nicht die Liste:

Wenn Sie die Liste in ein Objekt umbrechen möchten, ist vielleicht die Erstellung eines generischen Objektwrappers die beste Lösung. Dies kann mit einer Klasse wie folgt erreicht werden:

public final class JsonObjectWrapper { 
    private JsonObjectWrapper() {} 

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

Dann, bevor Sie Ihre Liste zurück mit der Antwort senden, nur wickeln Sie es in JsonObjectWrapper.withLabel("data", list) und Jackson kümmert sich um den Rest.

+0

Vielleicht Collections.singletonMap (Label, wrappedObject) wäre effizienter und Consise? –

+0

Großer Vorschlag @charlie_pl! Der Beitrag wurde aktualisiert. –