如何在Java中使用GSON或其他JSON库反序列化列表?

我可以在GAE上的序列化我的servlet列表,但我不能反序列化它。 我究竟做错了什么?

这是我的课堂video在GAE,这是连载:

包军团;

 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)
公开课video{

     @首要的关键
    私人stringID;

     @Persistent
    私人stringtitulo;

     @Persistent
    私人stringdescricao;

     @Persistent
    私人datedate;

  / **
   * @参数ID
   * @param titulo
   * @param descricao
   * @参数date
   * /

     public Video(){};

  public Video(String id,String titulo,String descricao,Date date){
   //超();
   this.id = id;
   this.titulo = titulo;
   this.descricao = descricao;
   this.date = date;
  }

  public String getId(){
  返回ID;
  }

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

  public String getTitulo(){
  返回titulo;
  }

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

  public String getDescricao(){
  返回descricao;
  }

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

  public Date getDate(){
  归期;
  }

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

 }

这是我在我的其他应用程序的video,我尝试反序列化:

包类;

 import java.util.Date;

公开课video{
 私人stringID;
 私人stringtitulo;
 私人stringdescricao;
 私人datedate;

  / **
   * @参数ID
   * @param titulo
   * @param descricao
   * @参数date
   * /
  public Video(String id,String titulo,String descricao,Date date){
   //超();
   this.id = id;
   this.titulo = titulo;
   this.descricao = descricao;
   this.date = date;
  }

  public String getId(){
  返回ID;
  }
  public void setId(String id){
   this.id = id;
  }
  public String getTitulo(){
  返回titulo;
  }
  public void setTitulo(String titulo){
   this.titulo = titulo;
  }
  public String getDescricao(){
  返回descricao;
  }
  public void setDescricao(String descricao){
   this.descricao = descricao;
  }
  public Date getDate(){
  归期;
  }
  public void setDate(Date date){
   this.date = date;
  }

 }

有了Gson,你只需要做一些事情:

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

您可能还需要在要反序列化的Video类上提供无参数构造函数。

另一种方法是使用数组作为types,例如:

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

这样可以避免Type对象带来的麻烦,如果你真的需要一个列表,你总是可以把数组转换成列表,例如:

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

恕我直言,这是更可读。

试试这一行

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

参考:

  1. 方法数组#asList
  2. 构造函数Gson
  3. 方法Gson#fromJson (源json可能是JsonElementReaderString
  4. 接口列表
  5. JLS – arrays
  6. JLS – 通用接口

小心使用@DevNG提供的答案。 Arrays.asList()返回ArrayList的内部实现,它不提供像add(),delete()等一些有用的方法。为了得到真正的ArrayList实例,你需要写这样的东西:

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