Как десериализовать список с помощью Gson или другой библиотеки JSON в Java?
Я могу сериализовать список в моем сервлете на 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;
/**
* @param id
* @param titulo
* @param descricao
* @param 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;
/**
* @param id
* @param titulo
* @param descricao
* @param 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;
}
}
5 ответов:
С Gson, вам просто нужно сделать что-то вроде:
List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());возможно, Вам также потребуется предоставить конструктор no-arg на
другой способ-использовать массив в качестве типа, например:
Video[] videoArray = gson.fromJson(json, Video[].class);таким образом, вы избегаете всех хлопот с объектом типа, и если вам действительно нужен список, вы всегда можете преобразовать массив в список, например:
List<Video> videoList = Arrays.asList(videoArray);ИМХО это гораздо более читабельным.
попробуйте этот однострочный
List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));
ссылки:
- метод массивы#asList
- конструктор Gson
- метод Gson#fromJson (источник
jsonможет быть типаJsonElement,ReaderилиString)- интерфейс список
- JLS-массивы
- JLS-Generic Интерфейсы
будьте осторожны, используя ответ, предоставленный @DevNG. Матрицы.asList () возвращает внутреннюю реализацию ArrayList, которая не реализует некоторые полезные методы, такие как add (), delete () и т. д. Если вы назовете их UnsupportedOperationException будет брошено. Для того, чтобы получить реальный экземпляр ArrayList вам нужно написать что-то вроде этого:
List<Video> = new ArrayList<>(Arrays.asList(videoArray));
Jackson JSON Java Parser очень популярен и используется в 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; }
Comments