2013-07-16 4 views
0

Ceci est la première fois que je pose une question ici, après 3 ans d'informatique, si nue avec moi.Désérialisation de la classe interne avec gson renvoie null

Je souhaite utiliser Gson pour désérialiser mon JSON en objets. J'ai défini les classes appropriées et certains de ces objets de classe sont inclus dans d'autres objets. Lorsque j'essayais de désérialiser tout le JSON, j'ai des valeurs nulles, alors j'ai commencé à le séparer.

J'ai atteint le point où toutes les classes inférieures sont à leurs côtés, mais en essayant de désérialiser en un objet qui contient une instance de cet objet plus petit - tout retourne comme nul.

Mon JSON partiel:

{ 
    "user_profile": { 
    "pk": 1, 
    "model": "vcb.userprofile", 
    "fields": { 
     "photo": "images/users/Screen_Shot_2013-03-18_at_5.24.13_PM.png", 
     "facebook_url": "https://google.com/facebook", 
     "site_name": "simple food", 
     "user": { 
     "pk": 1, 
     "model": "auth.user", 
     "fields": { 
      "first_name": "blue", 
      "last_name": "bla" 
     } 
     }, 
     "site_url": "https://google.com/" 
    } 
    } 
} 

UserProfile Classe:

public class UserProfile { 
    private int pk; 
    private String model; 
    private UPfields fields = new UPfields();//i tried with and without the "new" 
} 

UPfields Classe:

public class UPfields { 
    private String photo; 
    private String facebook_url; 
    private String site_name; 
    private User user; 
    private String site_url; 
} 

Classe utilisateur:

public class User { 
    private int pk; 
    private String model; 
    private Ufields fields; 
} 

Ufields Classe:

public class Ufields { 
    private String first_name; 
    private String last_name; 
} 

Dans mon principal j'appelle:

Gson gson = new Gson(); 
UserProfile temp = gson.fromJson(json, UserProfile.class); 

Donc, mon objet temp contenir que des valeurs nulles. J'ai essayé de changer les classes en statique, et ça ne marche pas. L'objet UPfields et tous les objets inférieurs fonctionnent correctement.

Des suggestions? lorsque je retire la

« { « user_profile »: » et il est le support de fermeture, le deserialize à un objet user_profile fonctionne.

Répondre

2

Pour analyser ce json exemple, vous devez créer la classe auxiliaire, qui contiendra champ nommé user_profile de type UserProfile:

public class UserProfileWrapper { 
    private UserProfile user_profile; 
} 

et analyser cette chaîne json avec cette classe:

UserProfileWrapper temp = gson.fromJson(json, UserProfileWrapper.class); 
+0

Je ne suis pas d'accord. Il serait préférable pour lui d'analyser la valeur du champ 'user_profile' de l'objet JSON, plutôt que d'introduire une classe wrapper superflue. –

+0

@TomG Eh bien, et pourriez-vous fournir un moyen simple, comment faire cela en utilisant Gson? – Andremoniy

+0

@Andremoniy je l'ai essayé, c'est toujours nul. – nitzanwe

0

Gson commence par analyser l'objet le plus à l'extérieur, qui dans votre cas a un seul champ, user_profile. Votre classe UserProfile n'a pas de champ user_profile, elle ne peut donc pas être désérialisée en tant qu'instance de cette classe. Vous devriez essayer de désérialiser la valeur du champ user_profile à la place.

+0

Eh bien, et pourriez-vous fournir un moyen simple, comment faire cela en utilisant' Gson'? – Andremoniy

+0

oh plz montrez-moi comment ... J'ai vu que lorsque je supprime le {"user_profile": ....} cela fonctionne ... alors quel est le problème? – nitzanwe

Questions connexes