2012-06-19 15 views
7

Sto usando Jackson all'interno di CXF per serializzare/deserializzare i dati. Sfortunatamente, ho difficoltà a configurare CXF/Jackson per deserializzare un array JSON. Apprezzerei l'aiuto per risolvere il problema.Come deserializzare l'array JSON?

Fino a questo punto maggior parte dei dati json è stato formato oggetto, cioè

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

Tuttavia, i dati JSON in questione è di forma:

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

L'endpoint del servizio Web si aspetta un oggetto "GroupsDto" (vedere di seguito) che ha una singola proprietà: una raccolta di gruppi, che è trasmessa via t lui matrice JSON.

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

Ho aggiunto @JsonDeserialize come segue alla proprietà della raccolta GroupsDto, ma NON funziona. Io continuo a ottenere: "Impossibile deserializzare istanza di GroupsDto fuori START_ARRAY gettone"

public class GroupsDto { 

     private Collection<GroupDto> groups; 

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

controllare questa domanda [Jackson - la lettura di un array di JSON con Robospice utilizzando loadDataFromNetwork() Metodo] [1] [1]: http://stackoverflow.com/questions/18792702/jackson-reading- a-json-array-with-robospice-using-loaddatafromnetwork-method – Sneg

risposta

0

Hai solo bisogno di specificare il @JsonDeserialize(contentAs=GroupDto.class) nel vostro setter. La serializzazione è sempre su get la deserializzazione è sempre su set, o se si preferisce è possibile specificare entrambi sul campo.

documentazione per il campione Serialize e Deserialize

Codice:

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

Grazie per l'heads-up sul problema getter/setter. Ho notato nel tuo esempio che stai qualificando l'array json, ad esempio "{\" * elenco * \ ": ...} È possibile deserializzare * senza * la qualifica? Se sì, come? – Ari

+0

non esiste alcuna qualifica, in questo caso la magia viene eseguita con l'annotazione '@ JsonDeserialize' La proprietà' contentAs' indica che questa è una raccolta e verrà deserializzata come 'ModelClass'. Se vuoi, puoi cambiare il nome della proprietà da' list' a qualcos'altro.Il nome non ha importanza, ciò che conta è l'annotazione –

+0

Capisco che il nome specifico non è rilevante, ma cosa si fa nel caso in cui non ci sia un nome? Nel tuo esempio stai leggendo in '{ "lista": [...]} ', che ha la chiave 'lista', ma cosa succede se non c'è chiave (nome) - cioè' [...] '? – Ari

8

Se i dati JSON è della forma:

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

avuto modo di utilizzare aggiungere un'altra classe dire 'wrapper':

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

    public ListDto() { 
    } 
} 

E usare questa classe durante la desertificazione. Questo approccio ha funzionato per me.

Problemi correlati