Comment désérialiser une liste à l'aide GSON ou d'une autre bibliothèque JSON en Java?
Question
Je peux sérialiser un List<Video>
dans mon servlet sur GAE, mais je ne peux pas désérialiser. Qu'est-ce que je fais mal?
Ceci est ma vidéo de classe GAE, qui est publié en feuilleton:
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;
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;
}
}
Ceci est ma classe vidéo dans une autre application, où je tente de désérialiser:
package classes;
import java.util.Date;
public class Video {
private String id;
private String titulo;
private String descricao;
private Date 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;
}
}
La solution
Avec Gson, vous auriez juste besoin de faire quelque chose comme:
List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());
Vous pourriez avoir besoin aussi de fournir un constructeur sans arg sur la classe Video
vous êtes la désérialisation à.
Autres conseils
Une autre façon consiste à utiliser un tableau comme un type, par exemple:.
Video[] videoArray = gson.fromJson(json, Video[].class);
De cette façon, vous évitez tous les tracas avec l'objet type, et si vous avez vraiment besoin d'une liste, vous pouvez toujours convertir le tableau à une liste, par exemple:.
List<Video> videoList = Arrays.asList(videoArray);
à mon humble avis ce qui est beaucoup plus lisible.
Essayez ce one-liner
List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));
Attention:. La liste des videos
, retourné par Arrays.asList
est immuable - vous ne pouvez pas insérer de nouvelles valeurs
Référence:
- Les tableaux # asList
- Gson
- La méthode Gson # fromJson (source
json
peut être de typeJsonElement
,Reader
ouString
) - Interface Liste
- JLS - Tableaux
- JLS - Générique interfaces
Soyez prudent en utilisant la réponse fournir par @DevNG. Arrays.asList () retourne la mise en œuvre interne de ArrayList qui ne met pas en œuvre des méthodes utiles comme add (), delete (), etc. Si vous les appelez UnsupportedOperationException sera jeté. Afin d'obtenir de véritables instance de ArrayList vous devez écrire quelque chose comme ceci:
List<Video> = new ArrayList<>(Arrays.asList(videoArray));
Jackson JSON Java Parser est très populaire et utilisé dans le cadre du printemps
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;
}