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 la désérialiser. Qu’est-ce que je fais mal?

Ceci est ma classe vidéo en GAE, qui est sérialisée:

 paquet 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)
 vidéo de classe publique {

     @Clé primaire
     ID de chaîne privée;

     @Persistant
     Titulo de cordes privé;

     @Persistant
     Ssortingng descricao privé;

     @Persistant
     date de date privée;

  / **
   * identifiant @param
   * @param titulo
   * @param descricao
   * date de rendez-vous
   * /

     Vidéo publique () {};

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

  public Ssortingng getId () {
   ID de retour;
  }

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

  public Ssortingng getTitulo () {
   retourner titulo;
  }

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

  public Ssortingng getDescricao () {
   retourner descricao;
  }

  public void setDescricao (Ssortingng descricao) {
   this.descricao = descricao;
  }

  public Date getDate () {
   date de retour;
  }

  setDate annulée publique (Date date) {
   this.date = date;
  }

 }

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

 classes de paquets;

 import java.util.Date;

 vidéo de classe publique {
  ID de chaîne privée;
  Titulo de cordes privé;
  Ssortingng descricao privé;
  date de date privée;

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

  public Ssortingng getId () {
   ID de retour;
  }
  public void setId (Ssortingng id) {
   this.id = id;
  }
  public Ssortingng getTitulo () {
   retourner titulo;
  }
  public void setTitulo (Ssortingng titulo) {
   this.titulo = titulo;
  }
  public Ssortingng getDescricao () {
   retourner descricao;
  }
  public vide setDescricao (Ssortingng descricao) {
   this.descricao = descricao;
  }
  public Date getDate () {
   date de retour;
  }
  setDate annulée publique (Date date) {
   this.date = date;
  }

 }

Avec Gson, il suffit de faire quelque chose comme:

List 

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

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

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

De cette façon, vous évitez tout problème avec l’object Type, et si vous avez vraiment besoin d’une liste, vous pouvez toujours convertir le tableau en une liste, par exemple:

 List 

IMHO c’est beaucoup plus lisible.

Essayez ce one-liner

 List 

Référence:

  1. Méthode Arrays # asList
  2. Constructeur Gson
  3. Méthode Gson # fromJson ( json source peut être de type JsonElement , Reader ou Ssortingng )
  4. Liste d’ interfaces
  5. JLS – Tableaux
  6. JLS – Interfaces génériques

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

 List 

Jackson JSON Java Parser est très populaire et utilisé dans le framework Spring

 import java.io.IOException; import java.io.SsortingngWriter; 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 jsonSsortingngToObjectArray(Ssortingng jsonSsortingng, Class 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(jsonSsortingng, mapper.getTypeFactory().constructCollectionType(List.class, clazz)); return obj; }