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

}
713   5  

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));

ссылки:

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

    Ничего не найдено.