Я могу сериализовать a List<Video>
в своем сервлете в GAE, но не могу десериализовать его. Что я делаю не так?
Это мой класс Video в GAE, который сериализован:
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;
}
}
Это мой класс Video в другом моем приложении, где я пытаюсь десериализовать:
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;
}
}
Ответы:
С Gson вам просто нужно сделать что-то вроде:
Вам также может потребоваться предоставить конструктор без аргументов для
Video
класса, в который вы десериализуетесь.источник
TypeToken<List<Video>>
... это трюк, позволяющий представлять результирующий типList<Video>
, поскольку подклассы полностью определенных универсальных типов сохраняют информацию об общем типе.TypeToken
все еще находитсяprotected
в Gson 2.1, поэтому все вышесказанное должно работать.Другой способ - использовать массив как тип, например:
Таким образом вы избегаете всех хлопот с объектом Type, и если вам действительно нужен список, вы всегда можете преобразовать массив в список, например:
ИМХО это намного читабельнее.
В Котлине это выглядит так:
Чтобы преобразовать этот массив в список, просто используйте
.toList()
методисточник
Попробуйте этот однострочный
Предупреждение: список
videos
, возвращаемыйArrays.asList
функцией, неизменен - вы не можете вставлять новые значения.Ссылка:
json
может быть типаJsonElement
,Reader
илиString
)источник
Будьте осторожны, используя ответ @DevNG. Arrays.asList () возвращает внутреннюю реализацию ArrayList, которая не реализует некоторые полезные методы, такие как add (), delete () и т. Д. Если вы их вызовете, будет выброшено исключение UnsupportedOperationException. Чтобы получить настоящий экземпляр ArrayList, вам нужно написать что-то вроде этого:
источник