web-dev-qa-db-ja.com

GSONまたはJavaの別のJSONライブラリを使用してリストをデシリアライズする方法は?

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

}

これは、他のアプリケーションの私のクラスのビデオで、逆シリアル化しようとしています:

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

}
103
Valter Silva

Gsonを使用すると、次のような操作を行うだけで済みます。

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

また、デシリアライズするVideoクラスに引数なしのコンストラクターを提供する必要があります。

289
ColinD

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

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

この方法により、Typeオブジェクトでのすべての面倒を回避できます。リストが本当に必要な場合は、常に配列をリストに変換できます。

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

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

95
DevNG

このワンライナーをお試しください

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

警告:Arrays.asListによって返されるvideosのリストは不変です。新しい値を挿入することはできません。


参照:

  1. メソッド Arrays#asList
  2. コンストラクター Gson
  3. メソッド Gson#fromJson (ソースjsonJsonElementReader、またはStringタイプの場合があります)
  4. インターフェース リスト
  5. JLS-配列
  6. JLS-汎用インターフェイス
7
naXa

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

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

Jackson 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;
    }
0
Tiago Medici