Как десериализовать список с помощью GSON или другой библиотеки JSON на Java?
Я могу сериализовать список в моем сервлете на GAE, но не могу десериализовать его. Что я делаю неправильно?
Это мой класс Video in GAE, который сериализован:
пакет легионтуб; импорт java.util.Date; import javax.jdo.annotations.IdGeneratorStrategy; import javax.jdo.annotations.IdentityType; import javax.jdo.annotations.PersistenceCapable; импорт javax.jdo.annotations.Persistent; import javax.jdo.annotations.PrimaryKey; @PersistenceCapable (identityType = IdentityType.APPLICATION) публичное видео класса { @Основной ключ частный идентификатор строки; @Persistent частная строка titulo; @Persistent частная строка descricao; @Persistent Дата свидания; / ** * @param id * @param titulo * @param descricao * @param date * / общедоступное видео () {}; Публичное видео (String ID, String Titulo, String descricao, Дата дата) { //супер(); this.id = id; this.titulo = titulo; this.descricao = descricao; this.date = date; } public String getId () { вернуть идентификатор; } public void setId (String id) { this.id = id; } public String getTitulo () { вернуть титуло; } public void setTitulo (Строка titulo) { this.titulo = titulo; } public String getDescricao () { возвращение descricao; } public void setDescricao (String descricao) { this.descricao = descricao; } public Date getDate () { Дата возвращения; } public void setDate (Date date) { this.date = date; } }
Это мой класс Видео в моем другом приложении, где я пытаюсь десериализовать:
пакетные занятия; импорт java.util.Date; публичное видео класса { частный идентификатор строки; частная строка titulo; частная строка descricao; Дата свидания; / ** * @param id * @param titulo * @param descricao * @param date * / Публичное видео (String ID, String Titulo, String descricao, Дата дата) { //супер(); this.id = id; this.titulo = titulo; this.descricao = descricao; this.date = date; } public String getId () { вернуть идентификатор; } public void setId(String id) { this.id = id; } public String getTitulo() { вернуть титуло; } public void setTitulo(Строка titulo) { this.titulo = titulo; } public String getDescricao() { возвращение descricao; } public void setDescricao(String descricao) { this.descricao = descricao; } public Date getDate() { Дата возвращения; } public void setDate (Date date) { this.date = date; } }
5 ответов
С Gson вам просто нужно сделать что-то вроде:
List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());
Вам также может понадобиться предоставить конструктор без аргументов в 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));
Ссылка:
- Массивы методов #asList
- Конструктор Gson
- Метод Gson # fromJson (источник
json
может быть типаJsonElement
,Reader
, или жеString
) - Список интерфейсов
- JLS - Массивы
- JLS - универсальные интерфейсы
Будьте осторожны, используя ответ, предоставленный @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;
}