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

Val*_*lva 106 java json gson

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

}
Run Code Online (Sandbox Code Playgroud)

Col*_*inD 295

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

List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());
Run Code Online (Sandbox Code Playgroud)

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

  • @Maxim:它正在创建`TypeToken <List <Video >>的匿名子类......这是一个允许结果类型表示`List <Video>`的技巧,因为完全指定的泛型类型的子类保留了泛型类型信息. (7认同)
  • 新的TypeToken <List <Video >>(){}.getType()子句中的{}是什么?它是如何合法的java语法? (3认同)

Dev*_*vNG 97

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

Video[] videoArray = gson.fromJson(json, Video[].class);
Run Code Online (Sandbox Code Playgroud)

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

List<Video> videoList = Arrays.asList(videoArray);
Run Code Online (Sandbox Code Playgroud)

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


naX*_*aXa 8

试试这个单行

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

参考:

  1. 方法数组#asList
  2. 构造函数Gson
  3. 方法GSON#fromJson(源videos可以是类型的Arrays.asList,jsonJsonElement)
  4. 接口列表
  5. JLS - 数组
  6. JLS - 通用接口