2011-02-28 5 views
4

Salut, comment désérialiser des objets json du type?Question sur la désérialisation de Json avec Gson

{"photo":{"id":5, "url":"http://pics.com/pic1.jpg"}}; 

Parce que normalement je créerais une classe:

public class Photo{ 
    private int id; 
    private String url; 

    public Photo(){ 
    }  
} 

Et puis il suffit d'exécuter à l'aide:

GsonBuilder gsonb = new GsonBuilder(); 
    Gson gson = gsonb.create();  
    Photo photo = gson.fromJson(response, Photo.class); 

Mais qui remplit tout est possible avec des valeurs nulles. Il fonctionnerait si je le Json était seulement

{"id":5, "url":"http://pics.com/pic1.jpg"} 

Toutes les idées?

Merci

Répondre

3

Créer une autre classe qui a la classe photo comme propriété

public class PhotoRoot { 

    private Photo photo; 

    public void setPhoto(Photo val) { 
    photo = val; 
    } 

    public Photo getPhoto() { 
    return photo; 
    } 

} 

Parse Ensuite, comme

GsonBuilder gsonb = new GsonBuilder(); 
Gson gson = gsonb.create();  
PhotoRoot photoRoot = gson.fromJson(response, PhotoRoot.class); 

Photo yourPhoto = photoRoot.getPhoto(); 

Cordialement

+0

J'apprécie cette réponse, mais il me semble que Gson a (ou devrait avoir, de toute façon) un moyen de cartographier la façon dont un champ json est mappé à un objet ... –

0

Votre structure json n'est pas valide. Vous devez le modifier en

{"id":5, "url":"http://pics.com/pic1.jpg"} 

pour correspondre à votre classe Photo.

La raison pour laquelle {"photo":{"id":5, "url":"http://pics.com/pic1.jpg"}} ne fonctionne pas est que GSON recherche une propriété appelée photo dans votre classe Photo qui n'existe pas.

+0

Il est souvent le cas où on n'a pas accès à changer la API En outre, la convention semble être d'enrouler tous les objets dans un objet JSON nommé. Je préférerais que nos bibliothèques adhèrent à ces conventions plutôt que l'inverse. –

Questions connexes