2012-12-25 3 views
0

J'essaie de sauvegarder un objet d'une classe en utilisant Gson, mais malheureusement cela ne fonctionne pas. Ma classe implémente l'interface de collection à l'aide d'une ArrayList. Quand j'essaye d'obtenir la chaîne de JSON j'obtiens une erreur laide. Voici un code:GSON sur les types génériques (Java Collection)

public class Prob1<T> implements Collection<T>{ 


ArrayList<T> alb = new ArrayList<>(); 

@Override 
public boolean add(T e) { 
    // TODO Auto-generated method stub 
    alb.add(e); 
    return false; 
} 

@Override 
public boolean addAll(Collection<? extends T> c) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public void clear() { 
    // TODO Auto-generated method stub 

} 

@Override 
public boolean contains(Object o) { 
    // TODO Auto-generated method stub 
    return alb.contains(o); 
} 

@Override 
public boolean containsAll(Collection<?> c) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean isEmpty() { 
    // TODO Auto-generated method stub 
    return alb.isEmpty(); 
} 

@Override 
public Iterator<T> iterator() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public boolean remove(Object o) { 
    // TODO Auto-generated method stub 
    alb.remove(o); 
    return false; 
} 

@Override 
public boolean removeAll(Collection<?> c) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public boolean retainAll(Collection<?> c) { 
    // TODO Auto-generated method stub 
    return false; 
} 

@Override 
public int size() { 
    // TODO Auto-generated method stub 
    return alb.size(); 
} 

@Override 
public Object[] toArray() { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public <T> T[] toArray(T[] a) { 
    // TODO Auto-generated method stub 
    return null; 
} 
public String toString() { 
    return alb.toString(); 
} 

Ici, il est ma tentative pour obtenir la chaîne JSON en utilisant GSon:

Prob1 p = new Prob1<String>(); 
    p.add("Johny"); 
    p.add("Albus"); 
    p.add("Sirrius"); 
    System.out.println(p); 

    Gson gson = new Gson(); 
    String json = gson.toJson(p); 

Et voici l'erreur que je reçois:

Exception dans le thread " main "java.lang.NullPointerException at com.google.gson.internal.bind.CollectionTypeAdapterFactory $ Adapter.write (CollectionTypeAdapterFactory.java:95) at com.google.gson.internal.bind.Collection TypeAdapterFactory $ Adapter.write (CollectionTypeAdapterFactory.java:60) at com.google.gson.Gson.toJson (Gson.java:586) at com.google.gson.Gson.toJson (Gson.java:565) à com.google.gson.Gson.toJson (Gson.java:520) à com.google.gson.Gson.toJson (Gson.java:500) à Prob1.main (Prob1.java:104)

Des pensées?

+0

Le problème n'est pas avec Gson, c'est avec votre implémentation 'Collection' (à laquelle la réponse ci-dessous fait allusion). Vous ne pouvez pas retourner 'null' de' iterator() '. Gson n'a aucun problème de sérialisation/désérialisation des collections à condition qu'elles soient correctement écrites et adhèrent à l'interface. –

+0

En outre ... êtes-vous certain que vous êtes supposé utiliser un 'ArrayList'? C'est * une * Collection'. Vous pouvez simplement retourner le 'Iterator' de sa méthode' iterator() 'si c'est le cas. –

Répondre

3

Vous avez créé une collection qui rompt le contrat donné par le interface. Ceci est une recette pour obtenir un comportement étrange chez les utilisateurs de votre classe. J'ai vérifié la source de Gson, et spécifiquement pour votre cas, il semble que cela se passe dans un NullPointerException parce que vous retournez null dans votre méthode iterator(). Je ne sais pas pourquoi vous créez votre propre classe de collection, et si vous avez vraiment besoin de le faire. Si vous le faites, je vous suggère d'étendre ForwardingCollection à partir de Google goyave, et seulement remplacer les méthodes que vous avez vraiment besoin de remplacer.

+0

Je dois implémenter la classe de collection avec un ArrayList pour un devoir et je dois pouvoir ajouter seulement l'objet qui est la même classe (c'est pourquoi j'utilise le type générique). Si j'utilise ForwardingCollection, je pourrai utiliser GSON? – user1773926