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

2022-08-31 07:55:32

我可以在 GAE 上的 servlet 中序列化 a,但我无法反序列化它。我做错了什么?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;
 }

}

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

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

}

答案 1

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

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

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


答案 2

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

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

通过这种方式,您可以避免Type对象的所有麻烦,如果您确实需要一个列表,您可以随时将数组转换为列表,例如:

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

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


Kotlin 中,这看起来像这样:

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

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