[java] Java에서 GSON 또는 다른 JSON 라이브러리를 사용하여 목록을 역 직렬화하는 방법은 무엇입니까?

List<Video>GAE의 서블릿에서 a 를 직렬화 할 수 있지만 역 직렬화 할 수 없습니다. 내가 뭘 잘못하고 있죠?

이것은 직렬화 된 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;

    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;

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

}



답변

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

IMHO 이것은 훨씬 더 읽기 쉽습니다.


에서 코 틀린 이 모습이 맘에 :

Gson().fromJson(jsonString, Array<Video>::class.java)

이 배열을 List로 변환하려면 .toList()방법을 사용하십시오.


답변

이 원 라이너를 사용해보십시오

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

경고 :에서 videos반환 된 목록 Arrays.asList은 변경할 수 없습니다. 새 값을 삽입 할 수 없습니다.


참고:

  1. 메서드 배열 #asList
  2. 생성자 Gson
  3. 메소드 Gson # fromJson (소스 json유형 JsonElementReader, 또는 String)
  4. 인터페이스 목록
  5. JLS-배열
  6. JLS-일반 인터페이스

답변

@DevNG가 제공하는 답변을 사용하여주의하십시오. Arrays.asList ()는 add (), delete () 등과 같은 유용한 메서드를 구현하지 않는 ArrayList의 내부 구현을 반환합니다. 이러한 메서드를 호출하면 UnsupportedOperationException이 발생합니다. 실제 ArrayList 인스턴스를 얻으려면 다음과 같이 작성해야합니다.

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


답변