2012-06-19 1 views
7

Ich benutze Jackson in CXF zum Serialisieren/Deserialisieren von Daten. Leider habe ich Schwierigkeiten bei der Konfiguration von CXF/Jackson, um ein JSON-Array zu deserialisieren. Ich würde mich über die Lösung des Problems freuen.Wie JSON-Array deserialisieren?

Bis zu diesem Punkt die meisten der JSON-Daten in Objektformat wurde, dh

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

jedoch die json betreffenden Daten ist von der Form:

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

Der Web-Service-Endpunkt erwartet ein "GroupsDto" -Objekt (siehe unten) , das über eine einzige Eigenschaft verfügt - eine Sammlung von Gruppen, die über t übertragen wird: Das JSON-Array.

Ich habe @JsonDeserialize wie folgt zur Sammlungseigenschaft GroupsDto hinzugefügt, aber es funktioniert nicht. Ich fahre fort zu bekommen: „Kann nicht deserialisieren Instanz GroupsDto aus START_ARRAY Token“

public class GroupsDto { 

     private Collection<GroupDto> groups; 

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

prüfen diese Frage [Jackson - ein JSON-Array mit Robospice mit loadDataFromNetwork() -Methode zu lesen] [1] [1]: http://stackoverflow.com/questions/18792702/jackson-reading- a-json-array-with-robospice-using-loaddatafromnetwork-method – Sneg

Antwort

0

Sie müssen nur die @JsonDeserialize(contentAs=GroupDto.class) in Ihrem Setter spezifizieren. Serialisierung ist immer auf erhalten Desserialisierung ist immer auf eingestellt, oder wenn Sie es vorziehen, können Sie beide auf dem Feld angeben.

Dokumentation für Serialize und Deserialize

Codebeispiel:

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

Vielen Dank für das Heads-up zum Thema Getter/Setter. Ich habe in Ihrem Beispiel festgestellt, dass Sie das JSON-Array qualifizieren, dh "{\" * list * \ ": ...} Ist es möglich, * ohne * die Qualifikation zu deserialisieren? Wenn ja, wie? – Ari

+0

gibt es keine Qualifikation, Die Magie wird in diesem Fall durch '@ JsonDeserialize' Annotation gemacht. Die Eigenschaft' contentAs' soll anzeigen, dass dies eine Sammlung ist und als 'ModelClass' deserialisiert wird. Wenn Sie möchten, können Sie den Eigenschaftsnamen von' list' in ändern etwas anderes. Der Name spielt keine Rolle, was wichtig ist, ist die Anmerkung. –

+0

Ich verstehe, dass der spezifische Name unwesentlich ist, aber was macht man, wenn es keinen Namen gibt? In Ihrem Beispiel lesen Sie in '{ "liste": [...]} ', die den Schlüssel 'list' hat, aber was ist, wenn es keinen Schlüssel (name) gibt - zB' [...] '? – Ari

8

Wenn json Daten ist von der Form:

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

Sie haben eine andere Klasse zu verwenden, fügen Sie sagen 'Wrapper':

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

    public ListDto() { 
    } 
} 

Und verwenden Sie diese Klasse beim Deserilisieren. Dieser Ansatz hat für mich funktioniert.