139

我可以List<Video>在 GAE 上的 servlet 中序列化 a,但不能反序列化它。我究竟做错了什么?

这是我在 GAE 中的课堂视频,已序列化:

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

}

这是我在其他应用程序中的课程视频,我尝试反序列化:

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

}
4

4 回答 4

365

使用 Gson,您只需要执行以下操作:

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

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

于 2010-11-30T21:14:22.087 回答
120

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

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

这样你就避免了 Type 对象的所有麻烦,如果你真的需要一个列表,你总是可以将数组转换为列表,例如:

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

恕我直言,这更具可读性。


Kotlin中,这看起来像这样:

Gson().fromJson(jsonString, Array<Video>::class.java)

要将此数组转换为列表,只需使用.toList()方法

于 2013-06-25T14:21:37.530 回答
11

我推荐这个单线

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

警告:由videos, 返回的列表Arrays.asList是不可变的 - 您不能插入新值。如果需要修改,请在new ArrayList<>(...).


参考:

  1. 方法数组#asList
  2. 构造函数Gson
  3. 方法Gson#fromJson(源json可能是JsonElement, Reader, 或String
  4. 接口列表
  5. JLS - 数组
  6. JLS - 通用接口
于 2016-10-18T10:37:12.623 回答
4

小心使用@DevNG 提供的答案。Arrays.asList() 返回 ArrayList 的内部实现,它没有实现一些有用的方法,如 add()、delete() 等。如果调用它们,则会抛出 UnsupportedOperationException。为了获得真正的 ArrayList 实例,您需要编写如下内容:

List<Video> = new ArrayList<>(Arrays.asList(videoArray));
于 2016-05-23T09:02:44.923 回答