如何在 Java 中使用 GSON 或另一个 JSON 库反序列化列表?

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

这是我在 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;
}


}

这是我在另一个应用程序中的类 Video,在这里我尝试反序列化:

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


}
130880 次浏览

对于 Gson,你只需要做这样的事情:

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

您可能还需要在要反序列化的 Video类上提供一个 no-arg 构造函数。

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

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

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

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

恕我直言,这样更易读。


科特林中是这样的:

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

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

小心使用@DevNG 提供的答案。 AsList ()返回 ArrayList 的内部实现,它不实现一些有用的方法,如 add ()、 delete ()等。如果您调用它们,则会抛出一个 Unsupport tedOperationException。 为了得到真正的 ArrayList 实例,您需要编写如下代码:

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

我推荐这句俏皮话

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

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


参考文献:

  1. 方法 数组 # asList
  2. 构造函数 葛森
  3. 方法 来自 Json(源 json可能是 JsonElementReaderString型)
  4. 接口 名单
  5. JLS-数组
  6. 通用接口