2016-09-21 1 views
0

J'essaie de tester mon service REST par une chaîne JSON à partir du client Advanced REST de Chrome. J'ai un JSON imbriqué ici. Je prends cela comme la chaîne et la cartographie à ma classe POJO:Récupération des valeurs du JSON imbriqué après désérialisation

ObjectMapper mapper = new ObjectMapper(); 
mapper.readValue(addressString, AddressPOJO.class); 

Ici, addressString contient la chaîne JSON ci-dessous

{ 
"location":"[{\"Asia\":[{\"India\":[{\"city\":\"Bengaluru\"}]}], [{\"India\":[{\"city\":\"Mumbai\"}]}]}] 
} 

Mon AddressPOJO a variable:

Map<String,?> location = new HashMap(); 

Je récupère les valeurs du POJO par

Map<String, ?> locations = addressPOJO.getLocation(); 
Iterator iterator1 = locations.entrySet().iterator(); 
while(iterator.hasNext()){ 
    Map.Entry pair1 = (Map.Entry)iterator1.next(); 
    Map<String,?> cities = (Map<String,?>) pair1.getValue(); 
    Iterator iterator2 = dataSets.entrySet().iterator(); 
    while(iterator.hasNext()){ 
     Map.Entry pair2 = (Map.Entry)iterator2.next(); 
     Map<String,?> city = (Map<String, ?>) pair2.getValue(); 
    } 
} 

Ici, je ne suis en mesure de retieve la deuxième entrée qui est

[{\"India\":[{\"city\":\"Mumbai\"}]}] 

je dois récupérer toutes les entrées. J'ai également essayé d'utiliser MultiMap comme ceci

MultiMap cities = (MultiMap) pair1.getValue(); 

Mais ceci n'est pas accepté par le compilateur. Veuillez noter que toutes les entrées sont de nature dynamique et que les paires (clé, valeur) changent selon la saisie de l'utilisateur. Toutes les suggestions comment je peux récupérer toutes les entrées dans cet exemple.

Répondre

0

De ma compréhension, peut-être il y a 2 choses que vous devez examiner:

  1. Pourquoi le type de location de données est Map<String, ?>? Parce que de votre chaîne JSON, le type de location est un Array ou un List, n'est-ce pas? Si vous voulez faire un Map, s'il vous plaît utiliser des chaînes comme: {"location" : "\"key\":\"value\""}. Si vous voulez en faire un List, supprimez le "" autour de la valeur.
  2. Une autre chose est que, il semble que vous vouliez une hiérarchie pour décrire la structure géographique. Disons, en Asia nous avons India et China, et en India nous avons Bengaluru et en China nous avons la ville Chengdu. Donc, la valeur Asia devrait également être List qui contient deux éléments India et China. Donc, vous devriez supprimer le ] et [ ici, et je pense que c'est aussi la raison pour laquelle vous êtes seulement en mesure de récupérer la deuxième entrée. enter image description here

Après mon code de test, j'ai modifié votre chaîne JSON et le type de location de données.

Location.java

public class Location { 
    private List location; 

    public List getLocation() { 
     return location; 
    } 

    public void setLocation(final List location) { 
     this.location = location; 
    } 
} 

TestJSON.java

public class testJson { 
    private static ObjectMapper mapper = new ObjectMapper(); 

    public static void main(final String[] args) throws JsonParseException, JsonMappingException, IOException { 
     final String locationString = "{\"location\":[{\"Asia\":[{\"India\":[{\"city\":\"Bengaluru\"}]}, {\"India\":[{\"city\":\"Mumbai\"}]}]}]}"; 
     final Location location = mapper.readValue(locationString, Location.class); 

     System.out.println("finish"); 
    } 
} 

toutes les entrées et les niveaux sont ok. Peut-être que vous pouvez essayer.

Espérons que cela aidera.

+0

Merci pour votre réponse. Désolé, je dois avoir mentionné que je supprime tous les '[' caractères de JSON avant de le mapper au POJO. Mon gars de frontend peut-être utiliser des tableaux pour générer du JSON et donc '['. De plus, l'exemple que j'ai donné ici n'est pas la chose exacte dont je parle. Je viens de donner un exemple de libellé. Donc, comme mentionné, je reçois la clé "Inde" plus d'une fois. Ce ne sera pas unique. Je le rend maintenant unique en le traçant avec '_' et un certain nombre aléatoire. Faites-moi savoir si je peux y faire face sans utiliser de nombre aléatoire. Merci encore. –

+0

Salut, Abhiram, de toute façon je pense que c'est mieux pour vous de ne pas utiliser "Map" car dans votre exemple la chaîne de localisation n'est pas une carte mais une "Liste". Si vous voulez utiliser map, essayez "LinkedHashMap" car c'est toujours la façon dont ObjectMapper représente un objet. –