2012-06-19 21 views
7

Estoy usando Jackson dentro de CXF para serializar/deserializar datos. Lamentablemente, tengo dificultades para configurar CXF/Jackson para deserializar una matriz JSON. Agradecería ayuda para resolver el problema.¿Cómo deserializar la matriz JSON?

Hasta este momento la mayor parte de los datos JSON se ha producido en formato de objeto, es decir

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

Sin embargo, los datos JSON en cuestión es de la forma:

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

El punto final del servicio web espera un objeto "GroupsDto" (ver a continuación) que tiene una sola propiedad: una colección de grupos, que es transmitida a través de t el conjunto JSON.

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

que añade @JsonDeserialize de la siguiente manera a la propiedad de colección GroupsDto, pero no funciona. Puedo continuar recibiendo: "No se puede deserializar instancia de GroupsDto de símbolo START_ARRAY"

public class GroupsDto { 

     private Collection<GroupDto> groups; 

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

Comprobar esta pregunta [Jackson - leer un array JSON con Robospice utilizando el método loadDataFromNetwork()] [1] [1]: http://stackoverflow.com/questions/18792702/jackson-reading- a-json-array-with-robospice-using-loaddatafromnetwork-method – Sneg

Respuesta

0

sólo tiene que especificar el @JsonDeserialize(contentAs=GroupDto.class) en su colocador. La serialización está siempre en get desserialization está siempre en establece, o si lo prefiere, puede especificar ambos en el campo.

Documentación para la muestra Serialize y Deserialize

Código:

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

Gracias por el aviso sobre el problema getter/setter. Noté en su ejemplo que califica la matriz JSON, es decir, "{\" * list * \ ": ...} ¿Es posible deserializar * sin * la calificación? En caso afirmativo, ¿cómo? – Ari

+0

no hay calificación, la magia se realiza en este caso mediante la anotación '@ JsonDeserialize'. La propiedad' contentAs' es para indicar que se trata de una colección y se deserializará como 'ModelClass'. Si lo desea, puede cambiar el nombre de la propiedad de' list' a algo más. El nombre no importa, lo que importa es la anotación. –

+0

Entiendo que el nombre específico es inmaterial, pero ¿qué hace uno en el caso de que no haya un nombre? En su ejemplo está leyendo en '{ "list": [...]} ', que tiene la 'lista' clave, pero ¿qué ocurre si no hay una clave (nombre) - es decir' [...] '? – Ari

8

Si los datos JSON es de la forma:

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

Tienes que usar añadir otra clase dicen 'envoltorio':

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

    public ListDto() { 
    } 
} 

Y use esta clase mientras deserailize. Este enfoque funcionó para mí.

Cuestiones relacionadas