Je peux sérialiser un List<Video>
dans mon servlet sur GAE, mais je ne peux pas le désérialiser. Qu'est-ce que je fais mal?
Ceci est ma vidéo de classe dans GAE, qui est sérialisée:
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;
}
}
Voici ma vidéo de classe dans mon autre application, où j'essaye de désérialiser:
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;
}
}
Réponses:
Avec Gson, il vous suffit de faire quelque chose comme:
Vous devrez peut-être également fournir un constructeur sans argument sur la
Video
classe vers laquelle vous désérialisez.la source
TypeToken<List<Video>>
... c'est une astuce qui permet au type résultant de se représenterList<Video>
, puisque les sous-classes de types génériques entièrement spécifiés conservent les informations de type générique.TypeToken
est toujoursprotected
dans Gson 2.1, donc ce qui précède devrait toujours fonctionner.Une autre façon est d'utiliser un tableau comme type, par exemple:
De cette façon, vous évitez tous les tracas avec l'objet Type, et si vous avez vraiment besoin d'une liste, vous pouvez toujours convertir le tableau en une liste, par exemple:
IMHO c'est beaucoup plus lisible.
À Kotlin, cela ressemble à ceci:
Pour convertir ce tableau en liste, utilisez simplement la
.toList()
méthodela source
Essayez ce one-liner
Attention: la liste des
videos
, renvoyée parArrays.asList
est immuable - vous ne pouvez pas insérer de nouvelles valeurs.Référence:
json
peut être de typeJsonElement
,Reader
ouString
)la source
Soyez prudent en utilisant la réponse fournie par @DevNG. Arrays.asList () retourne l'implémentation interne d'ArrayList qui n'implémente pas certaines méthodes utiles comme add (), delete (), etc. Si vous les appelez, une exception UnsupportedOperationException sera lancée. Pour obtenir une véritable instance ArrayList, vous devez écrire quelque chose comme ceci:
la source