partir - libreria gson java
¿Cómo deserializar una lista usando GSON u otra biblioteca JSON en Java? (5)
Puedo serializar una lista en mi servlet en GAE, pero no puedo deserializarla. ¿Qué estoy haciendo mal?
Este es mi video de clase en GAE, que está serializado:
package legiontube; import java.util.Date; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; @PersistenceCapable(identityType = IdentityType.APPLICATION) public class Video { @PrimaryKey private String id; @Persistent private String titulo; @Persistent private String descricao; @Persistent private Date date; /** * @param id * @param titulo * @param descricao * @param date */ public Video(){}; public Video(String id, String titulo, String descricao, Date date) { //super(); this.id = id; this.titulo = titulo; this.descricao = descricao; this.date = date; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } }
Este es mi video de clase en mi otra aplicación, donde trato de deserializar:
package classes; import java.util.Date; public class Video { private String id; private String titulo; private String descricao; private Date date; /** * @param id * @param titulo * @param descricao * @param date */ public Video(String id, String titulo, String descricao, Date date) { //super(); this.id = id; this.titulo = titulo; this.descricao = descricao; this.date = date; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public String getDescricao() { return descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } }
Con Gson, solo necesitarías hacer algo como:
List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());
Es posible que también necesites proporcionar un constructor sin argumentos en la clase Video
la que te estás deserializando.
Jackson JSON Java Parser es muy popular y se usa en Spring framework
import java.io.IOException;
import java.io.StringWriter;
import java.util.List;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public static <T> T jsonStringToObjectArray(String jsonString, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException {
T obj = null;
ObjectMapper mapper = new ObjectMapper();
mapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
obj = mapper.readValue(jsonString, mapper.getTypeFactory().constructCollectionType(List.class, clazz));
return obj;
}
Otra forma es usar una matriz como un tipo, por ejemplo:
Video[] videoArray = gson.fromJson(json, Video[].class);
De esta forma evitará todas las molestias con el objeto Type, y si realmente necesita una lista, siempre puede convertir la matriz en una lista, por ejemplo:
List<Video> videoList = Arrays.asList(videoArray);
En mi humilde opinión esto es mucho más legible.
Prueba este one-liner
List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));
Referencia:
- Método Arrays#asList
- Constructor Gson
- Método Gson#fromJson (
json
origen puede ser de tipoJsonElement
,Reader
oString
) - List interfaz
- JLS - Matrices
- JLS - Interfaces genéricas
Tenga cuidado al usar la respuesta proporcionada por @DevNG. Arrays.asList () devuelve la implementación interna de ArrayList que no implementa algunos métodos útiles, como add (), delete (), etc. Si los llama, se lanzará una UnsupportedOperationException. Para obtener una instancia real de ArrayList necesita escribir algo como esto:
List<Video> = new ArrayList<>(Arrays.asList(videoArray));