it-swarm.com.de

Wie kann eine Liste mit GSON oder einer anderen JSON-Bibliothek in Java deserialisiert werden?

Ich kann eine Liste in meinem Servlet auf GAE serialisieren, aber ich kann sie nicht deserialisieren. Was mache ich falsch?

Dies ist meine Klasse Video in GAE, die serialisiert ist:

 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) 
 öffentliche Klasse Video {

 @Primärschlüssel
 private String-ID; 

 @Persistent 
 private String titulo; 

 @Persistent 
 private String-Beschreibung; 

 @Persistent 
 privat Datum Datum; 

 /**
 * @param id 
 * @param titulo 
 * @param descricao 
 * @param Datum 
 */

 öffentliches Video () {}; 

 public Video (String-ID, String-Titel, String-Beschreibung, Datum, Datum) {
 //Super();
 this.id = id; 
 this.titulo = titulo; 
 this.descricao = descricao; 
 this.date = date; 
 } 

 public String getId () {
 ID zurückgeben; 
 } 

 public void setId (String-ID) {
 this.id = id; 
 } 

 public String getTitulo () {
 Rückkehr Titulo; 
 } 

 public void setTitulo (String titulo) {
 this.titulo = titulo; 
 } 

 public String getDescricao () {
 return descricao; 
 } 

 public void setDescricao (Stringbeschreibung) {
 this.descricao = descricao; 
 } 

 public Date getDate () {
 Rückflugdatum;
 } 

 public void setDate (Date Date) {
 this.date = date; 
 } 

} 

Dies ist mein Klassenvideo in meiner anderen Anwendung, in dem ich versuche zu deserialisieren:

 Paketklassen; 

 import Java.util.Date; 

 öffentliche Klasse Video {
 private String-ID; 
 private String titulo; 
 private String-Beschreibung; 
 privat Datum Datum; 

 /**
 * @param id 
 * @param titulo 
 * @param descricao 
 * @param Datum 
 */
 public Video (String-ID, String-Titel, String-Beschreibung, Datum, Datum) {
 //Super();
 this.id = id; 
 this.titulo = titulo; 
 this.descricao = descricao; 
 this.date = date; 
 } 

 public String getId () {
 ID zurückgeben; 
 } 
 public void setId (String-ID) {
 this.id = id; 
 } 
 public String getTitulo () {
 Rückkehr Titulo; 
 } 
 public void setTitulo (String titulo) {
 this.titulo = titulo; 
 } 
 public String getDescricao () {
 return descricao; 
 } 
 public void setDescricao (Stringbeschreibung) {
 this.descricao = descricao; 
 } 
 public Date getDate () {
 Rückflugdatum;
 } 
 public void setDate (Date Date) {
 this.date = date; 
 } 

} 
100
Valter Silva

Mit Gson müssen Sie nur Folgendes tun:

List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());

Möglicherweise müssen Sie auch einen Konstruktor ohne Argument für die Video-Klasse bereitstellen, für die Sie die Deserialisierung durchführen.

281
ColinD

Eine andere Möglichkeit ist die Verwendung eines Arrays als Typ, z.

Video[] videoArray = gson.fromJson(json, Video[].class);

Auf diese Weise vermeiden Sie den Ärger mit dem Type-Objekt. Wenn Sie wirklich eine Liste benötigen, können Sie das Array immer in eine Liste konvertieren, z.

List<Video> videoList = Arrays.asList(videoArray);

IMHO ist das viel lesbarer.

92
DevNG

Versuchen Sie diesen One-Liner

List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));

Referenz:

  1. Methode Arrays # asList
  2. Konstruktor Gson
  3. Methode Gson # fromJson (Quelle json kann vom Typ JsonElement, Reader oder String sein)
  4. Schnittstelle Liste
  5. JLS - Arrays
  6. JLS - Generische Schnittstellen
8
naXa

Seien Sie vorsichtig mit der Antwort von @DevNG . Arrays.asList () gibt die interne Implementierung von ArrayList zurück, die einige nützliche Methoden wie add (), delete () usw. nicht implementiert geworfen . Um eine echte ArrayList-Instanz zu erhalten, müssen Sie Folgendes schreiben:

List<Video> = new ArrayList<>(Arrays.asList(videoArray));
2
Bogdan Kornev

Jackson JSON Java Parser ist sehr beliebt und wird im Spring Framework verwendet

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;
    }
0
Tiago Medici