Как десериализовать список с помощью 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));

Ссылка:

  1. Массивы методов #asList
  2. Конструктор Gson
  3. Метод Gson # fromJson (источник json может быть типа JsonElement, Reader, или же String)
  4. Список интерфейсов
  5. JLS - Массивы
  6. 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;
    }
Другие вопросы по тегам