2013-01-31 14 views
5

moim kontroler zwraca listę obiektów myObj (z wykorzystaniem @ResponseBody)Jackson - Opakowanie listę obiektów z głównego obiektu

public MyObj 
{ 
    int a; 
    int b; 
} 

Zwrot JSON wygląda następująco:

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

chciałbym aby owinąć ten JSON, aby powrócił coś takiego:

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

Z tego co przeczytałem muszę włączyć SerializationCon fig.Funkcja.WRAP_ROOT_VALUE lub (?) użyj @JsonRootName ("dane") na moim kontrolerze.

Próbowałem również @XmlRootElement, nic nie działa. Każdy pomysł, jaki jest właściwy sposób na zawijanie listy obiektów z nazwą root?

+1

Czy kiedykolwiek zastanawiałeś się, jak to zrobić? Wymyśliłem rundę wokół drogi, tworząc mapę list, a następnie pozwalając ObjectMapperowi zrobić to, ale to nie jest takie eleganckie. Myślę, że jest lepszy sposób na zrobienie tego. Zrozumiałeś to? – Seagull

Odpowiedz

6

Wygląda na to, że mówisz o umieszczeniu @JsonRootName na liście, a nie o obiekcie, który nie osiągnie zamierzonego efektu.

Jeśli chcesz użyć @JsonRootName będziemy chcieli włączyć SerializationFeature.WRAP_ROOT_VALUE się jak wspomniano powyżej i dodać adnotację do klasy:

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

To owinąć samych przedmiotów, nie lista:

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

Jeśli chcesz zawinąć listę w obiekcie, najlepszym rozwiązaniem może być utworzenie ogólnego opakowania obiektu. Można to osiągnąć z klasy tak:

public final class JsonObjectWrapper { 
    private JsonObjectWrapper() {} 

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

Następnie przed wysłaniem listy z powrotem z odpowiedzią, po prostu zawinąć go w JsonObjectWrapper.withLabel("data", list) i Jackson dba o resztę.

+0

Być może Collections.singletonMap (label, wrappedObject) byłby bardziej wydajny i spójny? –

+0

Świetna sugestia @charlie_pl! Zaktualizowano wpis. –

Powiązane problemy