Je peux sérialiser une liste dans mon servlet sur GAE, mais je ne peux pas le désérialiser. Qu'est-ce que je fais mal?
Ceci est ma classe Video in GAE, qui est sérialisée:
package legiontube; importer Java.util.Date; importer javax.jdo.annotations.IdGeneratorStrategy; importer javax.jdo.annotations.IdentityType; javax.jdo.annotations.PersistenceCapable; import javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; .______. @ PersistenceCapable (identityType = IdentityType.APPLICATION) public class Video { @Clé primaire private String id; @Persistant private String titulo; @Persistant private String descricao; @Persistant privé Date date; /** * @param id * @param titulo * @param descricao * @param date */ public Video () {}; Vidéo publique (identifiant de chaîne, titre de chaîne, description de chaîne, date date) { //super(); this.id = id; this.titulo = titulo; this.descricao = descricao; this.date = date; } public String getId () { ID de retour; } public void setId (String id) { this.id = id; } public String getTitulo () { retour titulo; } public void setTitulo (String titulo) { this.titulo = titulo; } public String getDescricao () { retourner descricao; } setDescricao (String descricao) { this.descricao = descricao; } public Date getDate () { date de retour; } public void setDate (Date date) { this.date = date; } }
Ceci est ma classe vidéo dans mon autre application, où je tente de désérialiser:
classes de paquetages; import Java.util.Date; public class Video { private String id; privé String titulo; private String descricao; privé Date date; /** * @param id * @param titulo * @param descricao * @param date */ Vidéo publique (identifiant de chaîne, titre de chaîne, description de chaîne, date date) { //super(); this.id = id; this.titulo = titulo; this.descricao = descricao; this.date = date; } public String getId () { retour id; } public void setId (String id) { this.id = id; } public String getTitulo () { retour titulo; } public void setTitulo (String titulo) { this.titulo = titulo; } public String getDescricao () { retourner descricao; } setDescricao (String descricao) { this.descricao = descricao; } public Date getDate () { date de retour; } public void setDate (Date date) { this.date = date; } }
Avec Gson, il vous suffira de faire quelque chose comme:
List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());
Vous devrez peut-être également fournir un constructeur sans argument sur la classe Video
à laquelle vous effectuez la désérialisation.
Une autre méthode consiste à utiliser un tableau comme type, par exemple:
Video[] videoArray = gson.fromJson(json, Video[].class);
De cette façon, vous évitez tous les tracas liés à l’objet Type et si vous avez vraiment besoin d’une liste, vous pouvez toujours convertir le tableau en liste, par exemple:
List<Video> videoList = Arrays.asList(videoArray);
IMHO c'est beaucoup plus lisible.
Essayez ce one-liner
List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));
Référence:
json
peut être de type JsonElement
, Reader
ou String
Soyez prudent en utilisant la réponse fournie par @DevNG . Arrays.asList () renvoie une implémentation interne de ArrayList qui n'implémente pas certaines méthodes utiles telles que add (), delete (), etc. Si vous les appelez, une exception UnsupportedOperationException sera levé . Pour obtenir une instance ArrayList réelle, vous devez écrire quelque chose comme ceci:
List<Video> = new ArrayList<>(Arrays.asList(videoArray));
Jackson JSON Java Parser est très populaire et utilisé dans la structure Spring
import Java.io.IOException;
import Java.io.StringWriter;
import Java.util.List;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
public static <T> T jsonStringToObjectArray(String jsonString, Class<T> clazz) throws JsonParseException, JsonMappingException, IOException {
T obj = null;
ObjectMapper mapper = new ObjectMapper();
mapper = new ObjectMapper().configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
obj = mapper.readValue(jsonString, mapper.getTypeFactory().constructCollectionType(List.class, clazz));
return obj;
}