Как десериализовать список с помощью GSON или другой библиотеки JSON на Java? - PullRequest
102 голосов
/ 30 ноября 2010

Я могу сериализовать List в своем сервлете на 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 ]

286 голосов
/ 01 декабря 2010

С Gson вам просто нужно сделать что-то вроде:

List<Video> videos = gson.fromJson(json, new TypeToken<List<Video>>(){}.getType());

Возможно, вам также потребуется предоставить конструктор без аргументов для класса Video, который вы десериализуете.

95 голосов
/ 25 июня 2013

Другой способ - использовать массив в качестве типа, например ::1001.

Video[] videoArray = gson.fromJson(json, Video[].class);

Таким образом, вы избегаете всех хлопот с объектом Type, и если вам действительно нужен список, вы всегда можете преобразовать массив в список, например ::

List<Video> videoList = Arrays.asList(videoArray);

ИМХО, это гораздо более читабельно.

7 голосов
/ 18 октября 2016

Попробуйте этот однострочный

List<Video> videos = Arrays.asList(new Gson().fromJson(json, Video[].class));

Предупреждение: список videos, возвращаемый Arrays.asList, является неизменным - вы не можете вставить новые значения.


Ссылка:

  1. Метод Массивы # asList
  2. Конструктор Gson
  3. Метод Gson # fromJson (источник json может иметь тип JsonElement, Reader или String)
  4. Интерфейс Список
  5. JLS - массивы
  6. JLS - Универсальные интерфейсы
2 голосов
/ 23 мая 2016

Будьте осторожны, используя ответ, предоставленный @DevNG. Arrays.asList () возвращает внутреннюю реализацию ArrayList, которая не реализует некоторые полезные методы, такие как add (), delete () и т. Д. Если вы вызываете их, будет выдано исключение UnsupportedOperationException. Чтобы получить настоящий экземпляр ArrayList, вам нужно написать что-то вроде этого:

List<Video> = new ArrayList<>(Arrays.asList(videoArray));
0 голосов
/ 16 апреля 2018

Джексон 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...