2012-06-19 14 views
7

Używam Jackson w CXF do serializacji/deserializacji danych. Niestety, mam problem z konfiguracją CXF/Jackson w celu deserializacji macierzy JSON. Byłbym wdzięczny za pomoc w rozwiązaniu problemu.Jak odserializować macierz JSON?

Do tej pory większość danych json został w formacie obiektu, tj

{ "objectCollection": [ {...}, {...}, {...}... ] }

Jednak dane json których mowa, ma postać:

[ {...}, {...}, {...} ]

Punkt końcowy usługi sieci Web oczekuje obiektu "GroupsDto" (patrz poniżej), który ma jedną właściwość - zbiór grup, który jest transmitowany przez t on tablicę JSON.

@PATH(...) 
public Response createGroups(GroupsDto groups) { 
... 
} 

Dodałem @JsonDeserialize w następujący sposób do właściwości kolekcji GroupsDto, ale to NIE działa. I nadal się: „Nie można deserializować instancję GroupsDto z START_ARRAY tokena”

public class GroupsDto { 

     private Collection<GroupDto> groups; 

     /** 
     * @return the groups 
     */ 
     @XmlElement(name="group") 
     @JsonDeserialize(contentAs=GroupDto.class) 
     public Collection<GroupDto> getGroups() { 
       return groups; 
     } 
... 
} 
+0

zobacz na to pytanie [Jackson - odczyt tablicy JSON z Robospice pomocą loadDataFromNetwork() Metoda] [1] [1]: http://stackoverflow.com/questions/18792702/jackson-reading- a-json-array-with-robospice-using-loaddatafromnetwork-method – Sneg

Odpowiedz

0

Trzeba tylko określić @JsonDeserialize(contentAs=GroupDto.class) w seter. Serializacja jest zawsze na uzyskać desserializacji jest zawsze na zestaw, lub jeśli wolisz, możesz określić oba na polu.

Dokumentacja dla próbki Serialize i Deserialize

Kod:

import java.io.IOException; 
import java.util.List; 

import org.codehaus.jackson.JsonGenerationException; 
import org.codehaus.jackson.map.JsonMappingException; 
import org.codehaus.jackson.map.ObjectMapper; 
import org.codehaus.jackson.map.annotate.JsonDeserialize; 

public class JacksonDeserialize { 

    public static class ModelClass { 

     private String name; 

     public ModelClass() { 
     } 

     public String getName() { 
      return name; 
     } 

     public void setName(final String name) { 
      this.name = name; 
     } 

     public ModelClass(final String name) { 
      super(); 
      this.name = name; 
     } 

     @Override 
     public String toString() { 
      return "ModelClass [name=" + name + "]"; 
     } 

    } 

    public static class ListModelClass { 

     private List<ModelClass> list; 

     @JsonDeserialize(contentAs = ModelClass.class) 
     public void setList(final List<ModelClass> list) { 
      this.list = list; 
     } 

     @Override 
     public String toString() { 
      return "ListModelClass [list=" + list + "]"; 
     } 

    } 

    public static void main(final String[] args) throws JsonGenerationException, JsonMappingException, IOException { 
     ObjectMapper objectMapper = new ObjectMapper(); 
     System.out.println(objectMapper.readValue("{\"list\":[{\"name\":\"name1\"},{\"name\":\"name2\"}]}", 
       ListModelClass.class)); 
    } 

} 
+0

Dzięki za heads-up na problem getter/setter. Zauważyłem w twoim przykładzie, że kwalifikujesz tablicę jsonów, tj. "{\" * Lista * \ ": ...} Czy można deserializować * bez * kwalifikacji? Jeśli tak, to w jaki sposób? – Ari

+0

nie ma żadnych kwalifikacji, w tym przypadku magia jest wykonywana przez adnotację '@ JsonDeserialize' Właściwość' contentAs' ma na celu wskazanie, że jest to kolekcja i będzie deserializowana jako 'ModelClass' .Jeśli chcesz, możesz zmienić nazwę właściwości z' list' na coś innego.Nazwa nie ma znaczenia, liczy się adnotacja –

+0

Rozumiem, że nazwa jest nieistotna, ale co zrobić w przypadku, gdy nie ma nazwy? W twoim przykładzie czytasz w '{ "list": [...]} ', który ma" listę "kluczy, ale co jeśli nie ma klucza (nazwy) - np.' [...] '? – Ari

8

Jeżeli dane json jest postaci:

[ {...}, {...}, {...} ] 

Musisz użyć dodać inna klasa powiedzieć 'opakowanie':

@JsonIgnoreProperties(ignoreUnknown = true) 
public class ListDto extends ArrayList<GroupDto> { 

    public ListDto() { 
    } 
} 

Używaj tej klasy podczas deszyfrowania. To podejście zadziałało dla mnie.