Ответ 1
С Gson вам просто нужно сделать что-то вроде:
List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());
Вам также может потребоваться создать конструктор no-arg в классе Video
, который вы десериализируете.
Я могу сериализовать List<Video>
в своем сервлете на GAE, но не могу десериализовать его. Что я делаю не так?
Это мой класс Видео в 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;
}
}
Это видео моего класса в другом приложении, где я пытаюсь десериализовать:
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 вам просто нужно сделать что-то вроде:
List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());
Вам также может потребоваться создать конструктор no-arg в классе Video
, который вы десериализируете.
Другой способ - использовать массив как тип, например:
Video[] videoArray = gson.fromJson(json, Video[].class);
Таким образом, вы избегаете всех проблем с объектом Type, и если вам действительно нужен список, вы всегда можете преобразовать массив в список, например:
List<Video> videoList = Arrays.asList(videoArray);
ИМХО это гораздо читаемо.
Попробуй этот однострочный
List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));
Предупреждение: список videos
, возвращаемых Arrays.asList
является неизменным - вы не можете вставить новые значения.
Ссылка:
json
может иметь тип JsonElement
, Reader
или String
)Будьте осторожны, используя ответ, предоставляемый @DevNG. Arrays.asList() возвращает внутреннюю реализацию ArrayList, которая не реализует некоторые полезные методы, такие как add(), delete() и т.д. Если вы их вызовете, будет выбрано исключение UnsupportedOperationException. Чтобы получить реальный экземпляр ArrayList, вам нужно написать что-то вроде этого:
List<Video> = new ArrayList<>(Arrays.asList(videoArray));
Джексон JSON Java Parser очень популярен и используется в среде 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;
}