mit Gson oder einem anderen JSON-Bibliothek in Java, wie eine Liste deserialisieren?

StackOverflow https://stackoverflow.com/questions/4318458

  •  29-09-2019
  •  | 
  •  

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;
 }

}
War es hilfreich?

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.

zur Verfügung stellen müssen

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:

  1. Arrays # asList
  2. Gson
  3. Methode Gson # fromJson (Quelle json vom Typ JsonElement sein können, Reader oder String)
  4. Schnittstelle Liste
  5. JLS - Arrays
  6. 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;
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top