2013-05-13 7 views
1

Je suis un utilisateur débutant de Java et Gson et j'ai pu l'appliquer à mes besoins. J'ai maintenant des données JSON que je dois analyser dans une fileuse comme suit:Analyse de données JSON dynamiques avec Gson

{ 
    "lang":[ 
     "arabic", 
     "bengali", 
     "dutch-utf8", 
     "eng_root", 
     "english", 
     "english-utf8", 
     ... 
    ], 
    "themes":{ 
     "blue":{ 
      "chinese_ibm500":1, 
      "spanish":1, 
      "bengali":1, 
      "japanese":1, 
      "english":1, 
      "russian":1, 
      "french-utf8":1, 
      "eng_root":1, 
      "arabic":1, 
      "spanish-utf8":1, 
      "portuguese":1, 
      ... 
     }, 
     "green":{ 
      "eng_root":1, 
      "engmonsoon":1, 
      "english":1 
      ... 
     }, 
     "red":{ 
      "chinese_ibm500":1, 
      "spanish":1, 
      "bengali":1, 
      ... 
     } 
    } 
} 

Donc de ce JSON je besoin de 2 choses:

1) le tableau sous lang est dynamique pour ses langues installé sur le serveur. Comment pourrais-je obtenir toutes les entrées?

J'ai une classe comme suit, mais im coincé à ce que je devrais faire après mon retour lang

public class ListData { 

    private List<Language> lang; 

    public List<Language> getLang { 
     return lang; 
    } 

    public static class Language { 
     ??? 
    } 
} 

2) après avoir compris 1 je pourrais être en mesure de comprendre cela. Sous les thèmes sont les couleurs qui peuvent encore être plus ou moins {violet, orange, peu importe}. J'ai juste besoin d'une liste de ces thèmes, en ce qui me concerne je n'ai pas besoin de connaître les langues pour chacun.

Feel like cette question se transforme en un livre. J'ai beaucoup cherché et je déteste poser des questions, mais je suis assez perplexe. Merci d'avance.

+0

Où est votre code qui utilise Gson? –

+0

Vous pourriez, bien sûr, juste l'analyser en objets JSON, vs faire la chose Gson. –

Répondre

5

1) Afin d'obtenir le tableau "lang", juste modifier

private List<Language> lang; 

pour

private List<String> lang; 

Puisque les éléments à l'intérieur tableau "lang" sont toutes les chaînes, vous ne avez pas besoin de classe Language à stocker ces valeurs, ils seront analysés correctement en tant que chaînes. Et peu importe combien de chaînes le tableau contient ...


2) Pour analyser "themes", vous devez remarquer que ce n'est pas un tableau [ ], mais un objet { }, vous avez besoin pour analyser avec un objet, et la classe la plus appropriée ici est un Map comme celui-ci:

private Map<String, Object> themes; 

note: comme vous avez dit que vous n'avez pas besoin des données sous "blue", "green", etc ... vous peut simplement Object comme le type de valeur dans la carte, sinon vous auriez besoin d'une certaine classe ...

L'utilisation d'un Map ici vous permet d'avoir un nombre arbitraire de thèmes dans votre réponse JSON.


Ainsi, dans résumé, vous avez juste besoin d'une classe comme:

public class ListData { 

    private List<String> lang; 
    private Map<String, Object> themes; 

    //getters & setters 
} 

et analysez votre JSON avec:

Gson gson = new Gson(); 
ListData data = gson.fromJson(yourJsonString, ListData.class); 

Votre liste des Langs seront sous:

data.getLang(); 

et votre liste des thèmes seront sous:

data.getThemes().keySet(); 

Je vous suggère de jeter un oeil à Gson documentation. C'est assez court et clair et vous comprendrez tout beaucoup mieux ...

+0

Merci beaucoup. J'ai effectivement essayé ceci avant mais j'obtenais des erreurs au sujet de l'attente de tableau mais était l'objet ou les sortes mais j'avais créé seulement pour lang et pas pour des thèmes dans ListData. En fait, en vérifiant ma réponse JSON, j'obtiens des thèmes avant lang et quand j'ai édité ma ListData avec la carte cette fois-ci cela fonctionne maintenant. Donc, je suppose que GSON ne savait pas comment analyser les thèmes? Incroyable ... –

+0

Comme une mini question, disons qu'il y avait des lang, des thèmes, et des polices. Si je voulais juste la langue et les thèmes, la réponse ci-dessus fonctionnerait-elle seule ou devrais-je créer un objet pour gérer les polices et ne jamais l'utiliser? –

+0

Peu importe si vous avez plus d'objets dans votre JSON en dehors de 'lang' et' themes' ... Gson ne traite que votre classe et compare le nom des attributs de classe avec les noms des éléments JSON ... Si une classe attribut correspond au nom de l'élément trouvé dans le JSON, il essaye de coller le contenu de l'élément JSON dans l'attribut class ... S'il y a un élément dans votre JSON qui ne correspond à aucun nom d'attribut de classe, Gson ignore juste que élément... – MikO