web-dev-qa-db-fra.com

Comment désérialiser une liste en utilisant GSON ou une autre bibliothèque JSON en Java?

Je peux sérialiser une liste dans mon servlet sur GAE, mais je ne peux pas le désérialiser. Qu'est-ce que je fais mal?

Ceci est ma classe Video in GAE, qui est sérialisée:

 package legiontube; 

 importer Java.util.Date; 

 importer javax.jdo.annotations.IdGeneratorStrategy; 
 importer javax.jdo.annotations.IdentityType; 
 javax.jdo.annotations.PersistenceCapable; 
 import javax.jdo.annotations.Persistent; 
 import javax.jdo.annotations.PrimaryKey; .______. @ PersistenceCapable (identityType = IdentityType.APPLICATION) 
 public class Video {

 @Clé primaire
 private String id; 

 @Persistant
 private String titulo; 

 @Persistant
 private String descricao; 

 @Persistant
 privé Date date; 

 /**
 * @param id 
 * @param titulo 
 * @param descricao 
 * @param date 
 */

 public Video () {}; 

 Vidéo publique (identifiant de chaîne, titre de chaîne, description de chaîne, date date) {
 //super();
 this.id = id; 
 this.titulo = titulo; 
 this.descricao = descricao; 
 this.date = date; 
 } 

 public String getId () {
 ID de retour; 
 } 

 public void setId (String id) {
 this.id = id; 
 } 

 public String getTitulo () {
 retour titulo; 
 } 

 public void setTitulo (String titulo) {
 this.titulo = titulo; 
 } 

 public String getDescricao () {
 retourner descricao; 
 } 

 setDescricao (String descricao) {
 this.descricao = descricao; 
 } 

 public Date getDate () {
 date de retour;
 } 

 public void setDate (Date date) {
 this.date = date; 
 } 

} 

Ceci est ma classe vidéo dans mon autre application, où je tente de désérialiser:

 classes de paquetages; 

 import Java.util.Date; 

 public class Video {
 private String id; 
 privé String titulo; 
 private String descricao; 
 privé Date date; 

 /**
 * @param id 
 * @param titulo 
 * @param descricao 
 * @param date 
 */
 Vidéo publique (identifiant de chaîne, titre de chaîne, description de chaîne, date date) {
 //super();
 this.id = id; 
 this.titulo = titulo; 
 this.descricao = descricao; 
 this.date = date; 
 } 

 public String getId () {
 retour id; 
 } 
 public void setId (String id) {
 this.id = id; 
 } 
 public String getTitulo () {
 retour titulo; 
 } 
 public void setTitulo (String titulo) {
 this.titulo = titulo; 
 } 
 public String getDescricao () {
 retourner descricao; 
 } 
 setDescricao (String descricao) {
 this.descricao = descricao; 
 } 
 public Date getDate () {
 date de retour;
 } 
 public void setDate (Date date) {
 this.date = date; 
 } 

} 
100
Valter Silva

Avec Gson, il vous suffira de faire quelque chose comme:

List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());

Vous devrez peut-être également fournir un constructeur sans argument sur la classe Video à laquelle vous effectuez la désérialisation.

281
ColinD

Une autre méthode consiste à utiliser un tableau comme type, par exemple:

Video[] videoArray = gson.fromJson(json, Video[].class);

De cette façon, vous évitez tous les tracas liés à l’objet Type et si vous avez vraiment besoin d’une liste, vous pouvez toujours convertir le tableau en liste, par exemple:

List<Video> videoList = Arrays.asList(videoArray);

IMHO c'est beaucoup plus lisible.

92
DevNG

Essayez ce one-liner

List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));

Référence:

  1. Méthode Arrays # asList
  2. Constructeur Gson
  3. Méthode Gson # fromJson (source json peut être de type JsonElement, Reader ou String
  4. Interface Liste
  5. JLS - Tableaux
  6. JLS - Interfaces génériques
8
naXa

Soyez prudent en utilisant la réponse fournie par @DevNG . Arrays.asList () renvoie une implémentation interne de ArrayList qui n'implémente pas certaines méthodes utiles telles que add (), delete (), etc. Si vous les appelez, une exception UnsupportedOperationException sera levé . Pour obtenir une instance ArrayList réelle, vous devez écrire quelque chose comme ceci:

List<Video> = new ArrayList<>(Arrays.asList(videoArray));
2
Bogdan Kornev

Jackson JSON Java Parser est très populaire et utilisé dans la structure Spring

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;
    }
0
Tiago Medici