如何在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));