Comment désérialiser une liste à l'aide GSON ou d'une autre bibliothèque JSON en Java?

StackOverflow https://stackoverflow.com/questions/4318458

  •  29-09-2019
  •  | 
  •  

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;
 }

}
Était-ce utile?

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:

  1. Les tableaux # asList
  2. Gson
  3. La méthode Gson # fromJson (source json peut être de type JsonElement, Reader ou String)
  4. Interface Liste
  5. JLS - Tableaux
  6. 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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top