2013-07-01 4 views
1

J'ai un json sous une forme spécifique que je dois désérialiser. Pour ce faire, j'ai pensé à ma meilleure bibliothèque Gson, mais je suis confronté à un problème ici car j'ai des clés qui sont dynamiques.Désérialisation Gson avec modèle client

Je pense que vous comprendrez avec un bon exemple. Voici le JSON:

{ 

"institution1": { 
    "_id": "51cc7bdc544ddb3f94000002", 
    "announce": { }, 
    "city": "Melun", 
    "coordinates": [ 
     2.65106, 
     48.528976 
    ], 
    "country": "France", 
    "created_at": "2013-06-27T17:52:28Z", 
    "name": "italien", 
    "state": "Seine et Marne", 
    "street": "Avenue Albert Moreau", 
    "updated_at": "2013-06-27T17:52:28Z" 
}, 
"institution2": { 
    "_id": "51d1dfa8544ddb9157000001", 
    "announce": { 
     "announce1": { 
      "_id": "51d1e036544ddb9157000002", 
      "created_at": "2013-07-01T20:02:35Z", 
      "description": "description formule 1", 
      "institution_id": "51d1dfa8544ddb9157000001", 
      "title": "formule dejeune", 
      "type": "restoration", 
      "updated_at": "2013-07-01T20:02:35Z" 
     }, 
     "announce2": { 
      "_id": "51d1e074544ddb9157000003", 
      "created_at": "2013-07-01T20:03:08Z", 
      "description": "description formule soir", 
      "institution_id": "51d1dfa8544ddb9157000001", 
      "title": "formule soiree", 
      "type": "restoration", 
      "updated_at": "2013-07-01T20:03:08Z" 
     } 
    }, 
    "city": "Melun", 
    "coordinates": [ 
     2.65106, 
     48.528976 
    ], 
    "country": "France", 
    "created_at": "2013-07-01T19:59:36Z", 
    "name": "restaurant francais chez pierre", 
    "state": "Seine et Marne", 
    "street": "Avenue Albert Moreau", 
    "updated_at": "2013-07-01T19:59:36Z" 
} 
} 

Vous pouvez aller here pour une meilleure vue. Donc, je créé une classe pour le faire, JsonModel.java

public class JsonModel 
{ 
public HashMap<String, Institution> entries; 

public static class Institution 
{ 
    public String _id; 
    public HashMap<String, Announce> announce; 
    public String city; 
    public String country; 
    public List<Double> coordinates; 
    public String created_at; 
    public String name; 
    public String state; 
    public String street; 
    public String updated_at; 
} 

public static class Announce 
{ 
    public String _id; 
    public String created_at; 
    public String description; 
    public String institution_id; 
    public String title; 
    public String type; 
    public String updated_at; 
} 

} 

Et puis, j'ai demandé Gson désérialiser qu'avec le code suivant:

JsonModel data = new Gson().fromJson(json, JsonModel.class); 

Comme données est nulle, je présume que ça ne marche pas comme je m'y attendais ... Et j'ai pensé utiliser HashMap car je ne connais pas à l'avance la clé comme institution1, institution2, ... Qu'en penses-tu? Puis-je faire cela ?

Et s'il vous plaît ne me dites pas d'utiliser le support, je rêve juste d'avoir ceux-ci!

Merci d'avance!

EDIT: j'ai pu faire ce travail chose en ajoutant un objet racine

{ 

    "root":{ ..the json.. } 

} 

ET changer

public HashMap<String, Institution> entries; 

par

public HashMap<String, Institution> root; 

Ainsi, le problème est-il besoin de reconnaître le sapin st élément mais en fait je ne serai pas en mesure de modifier le json, y at-il un moyen de le faire différemment?

+0

Je pensais à ajouter ce json = "{\" root \ ":" + json + "}" MAIS pas vraiment sympa ... – azerto00

Répondre

1

L'utilisation d'un Map est parfait, mais vous ne pouvez pas utiliser votre JsonModel classe, car avec cette classe vous en supposant que dans votre JSON vous avez un objet qui contient un champ appelé "entries" qui représente à son tour une carte , comme ceci:

{ 
    "entries": { the map here... } 
} 

Et vous ne l'avez pas, mais votre JSON représente directement une carte (pas un objet avec un champ appelé les entrées qui représente une carte!). A savoir, vous avez seulement ceci:

{ the map here... } 

Vous avez donc besoin d'analyser en conséquence, la suppression de la classe JsonModel et en utilisant directement un Map désérialiser ...

Vous devez utiliser un TypeToken pour obtenir le type de votre Map, comme ceci:

Type mapType = new TypeToken<Map<String, Institution>>() {}.getType(); 

Et puis utilisez la méthode .fromJson() avec ce type, comme celui-ci:

Map<String, Institution> map = gson.fromJson(json, mapType); 
+0

Merci! Cela fonctionne maintenant, mais je n'arrive toujours pas à comprendre pourquoi HashMap ne fonctionne pas et Map fonctionne ... – azerto00

+0

@ azerto00, en fait si vous remplacez 'Map' par' HashMap' dans ** mon code **, je pense que ça devrait marcher aussi ... ça ne marche pas? – MikO

+0

Oh mon dieu tu as raison! Donc, si je vous ai suivi, la ligne HashMap entrées; à l'intérieur de la classe JsonModel était faux. Au lieu de cela, j'ai dû utiliser TypeToken directement parce qu'il n'y a pas de champ appelé "entrées"? – azerto00

Questions connexes