139

サーブレットでGAEをシリアルList<Video>化することはできますが、逆シリアル化することはできません。私は何が間違っているのですか?

これは、シリアル化された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;
 }

}

これは、他のアプリケーションのクラスVideoであり、逆シリアル化を試みます。

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

}
4

4 に答える 4

365

Gsonを使用すると、次のようなことを行う必要があります。

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

Videoまた、逆シリアル化するクラスに引数なしのコンストラクターを提供する必要がある場合もあります。

于 2010-11-30T21:14:22.087 に答える
120

別の方法は、配列を型として使用することです。例:

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

このようにして、Typeオブジェクトの煩わしさをすべて回避できます。本当にリストが必要な場合は、いつでも配列をリストに変換できます。例:

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

私見これははるかに読みやすいです。


Kotlinでは、これは次のようになります。

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

この配列をリストに変換するには、.toList()メソッドを使用するだけです

于 2013-06-25T14:21:37.530 に答える
11

このワンライナーをお勧めします

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

警告:videosによって返される、のリストArrays.asListは不変です-新しい値を挿入することはできません。変更する必要がある場合は、でラップしnew ArrayList<>(...)ます。


参照:

  1. メソッドArrays#asList
  2. コンストラクターGson
  3. メソッドGson#fromJson(ソースは、、、またはjsonのタイプJsonElementである可能性があります)ReaderString
  4. インターフェイスリスト
  5. JLS-アレイ
  6. JLS-ジェネリックインターフェイス
于 2016-10-18T10:37:12.623 に答える
4

@DevNGによって提供される回答を使用するように注意してください。Arrays.asList()は、add()、delete()などのいくつかの便利なメソッドを実装しないArrayListの内部実装を返します。これらを呼び出すと、UnsupportedOperationExceptionがスローされます。実際のArrayListインスタンスを取得するには、次のように記述する必要があります。

List<Video> = new ArrayList<>(Arrays.asList(videoArray));
于 2016-05-23T09:02:44.923 に答える