GSON veya Java'da başka bir JSON kitaplığı kullanarak bir listenin serisini nasıl kaldırabilirim?


121

List<Video>GAE'de sunucu uygulamamda bir seri hale getirebilirim , ancak seri halini alamıyorum. Neyi yanlış yapıyorum?

Bu, GAE'de serileştirilmiş sınıf videom:

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

}

Bu benim diğer uygulamamdaki sınıf Video'm, burada seri halini kaldırmaya çalışıyorum:

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

}

Bilginize, Gson 1.7'den itibaren, argalsız kurucu artık gerekli değildir. Bkz groups.google.com/group/google-gson/browse_thread/thread/... Mutlu kodlama.
Joel

Yanıtlar:


328

Gson ile aşağıdaki gibi bir şey yapmanız gerekir:

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

Seri durumdan arındırdığınız Videosınıfta argümansız bir kurucu sağlamanız da gerekebilir .


Ahbap, harikasın, çok teşekkür ederim, işe yarıyor. Benim hatam argümansız bir kurucu yaratmak değildi. Çok teşekkür ederim!
Valter Silva

4
New TypeToken <List <Video>> () {}. GetType () cümlesindeki {} nedir? Yasal java sözdizimi nasıl?
Maxim Veksler

8
@Maxim: Anonim bir alt sınıf yapıyor TypeToken<List<Video>>... Bu, sonuçta ortaya çıkan türün temsil edilmesine izin veren bir hile List<Video>, çünkü tamamen belirlenmiş genel türlerin alt sınıfları genel tür bilgilerini koruyor.
ColinD

1
Gson 2.1 sürümü artık varsayılan bir erişim yapıcısına sahip ... bu nedenle yukarıdaki kodu kullanamayız ... bunun yerine artık TypeToken sınıfı aşağıdaki yönteme sahip: public static TypeToken <?> Get (Type type) {return new TypeToken (tip); } Ama bu durumda ... ona doğru türü nasıl sağlayabiliriz ???
Pablo

1
@Pablo: Bana öyle görünüyor ki, argümansız kurucu TypeTokenhala protectedGson 2.1'de, bu yüzden yukarıdakiler hala çalışmalı.
ColinD

108

Diğer bir yol da bir diziyi tür olarak kullanmaktır, örneğin:

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

Bu şekilde, Type nesnesiyle ilgili tüm zorluklardan kaçınırsınız ve gerçekten bir listeye ihtiyacınız varsa, diziyi her zaman bir listeye dönüştürebilirsiniz, örneğin:

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

IMHO bu çok daha okunabilir.


In KOTLIN bu bakışlar böyle:

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

Bu diziyi Listeye dönüştürmek için .toList()yöntemi kullanın


1
Kabul edilen cevap güzel, ancak bunu tercih ediyorum çünkü gerçekten tek istediğim bir şeyler listesi ve dizi bir "
eşya


2

@DevNG tarafından sağlanan yanıtı kullanırken dikkatli olun. Arrays.asList (), add (), delete (), vb. Gibi bazı yararlı yöntemleri uygulamayan dahili ArrayList uygulamasını döndürür. Bunları çağırırsanız, bir UnsupportedOperationException atılır. Gerçek ArrayList örneğini elde etmek için şuna benzer bir şey yazmanız gerekir:

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

wat? Arrays.asList, add () ve remove () işlevlerini de sağlayan bir List arabirimi döndürür!
Enrichman

2
@Enrichman: Arrays.asList (), belirtilen dizi tarafından desteklenen sabit boyutlu bir liste döndürür. Bu ArrayList uygulaması bir AbstractList sınıfını genişletir ve temel sınıftan remove (int index) yöntemini geçersiz kılmaz. AbstractList.remove (int index) 'in kaynak koduna bakarsanız, her zaman UnsupportedOperationException atıldığını görürsünüz. Aynısı add () yöntemi için de geçerlidir.
Bogdan Kornev

1
Wo, bu çok çirkin, bunu bilmiyordum. Gösterdiğiniz için teşekkürler. :)
Enrichman
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.