mit Gson oder einem anderen JSON-Bibliothek in Java, wie eine Liste deserialisieren?
Frage
kann ich ein List<Video>
in meinem Servlet auf GAE serialisiert, aber ich kann es nicht deserialisieren. Was mache ich falsch?
Das ist meine Klasse Video in GAE, die serialisiert wird:
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;
}
}
Das ist meine Klasse Video in meiner anderen Anwendung, wo ich zu deserialisieren versuchen:
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;
}
}
Lösung
Mit Gson, würden Sie brauchen nur, wie etwas zu tun:
List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());
Sie können auch einen nicht-arg Konstruktor auf der Video
Klasse du bist Deserialisieren zu.
Andere Tipps
Eine andere Möglichkeit ist ein Array als Typ zu verwenden, z.
Video[] videoArray = gson.fromJson(json, Video[].class);
So können Sie all die Probleme mit dem Type-Objekt vermeiden, und wenn Sie wirklich eine Liste benötigen, können sie das Array konvertieren zu einer Liste, z.
List<Video> videoList = Arrays.asList(videoArray);
IMHO das ist viel besser lesbar.
Versuchen Sie, diese Einzeiler
List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));
. Achtung: Die folgende Liste von videos
kehrte von Arrays.asList
ist unveränderlich - Sie können nicht einfügen neue Werte
Referenz:
- Arrays # asList
- Gson
- Methode Gson # fromJson (Quelle
json
vom TypJsonElement
sein können,Reader
oderString
) - Schnittstelle Liste
- JLS - Arrays
- JLS - Generic Schnittstellen
Seien Sie vorsichtig mit der Antwort von @DevNG bieten. Arrays.asList () gibt interne Implementierung von Arraylist, die nicht einige nützliche Methoden wie add (), delete () nicht implementiert, etc. Wenn Sie sie ein UnsupportedOperationException geworfen werden nennen. Um reale Arraylist-Instanz zu erhalten müssen Sie so etwas schreiben:
List<Video> = new ArrayList<>(Arrays.asList(videoArray));
Jackson JSON Java-Parser ist sehr beliebt und verwendet in Spring-Framework
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;
}