如何在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));
参考:
- 方法数组#asList
- 构造函数Gson
- 方法Gson#fromJson (源
json可能是JsonElement,Reader或String) - 接口列表
- JLS – arrays
- JLS – 通用接口
小心使用@DevNG提供的答案。 Arrays.asList()返回ArrayList的内部实现,它不提供像add(),delete()等一些有用的方法。为了得到真正的ArrayList实例,你需要写这样的东西:
List<Video> = new ArrayList<>(Arrays.asList(videoArray));