2017-07-27 1 views
2

J'ai un service d'où je reçois une réponse de chaîne JSON comme comme indiqué ci-dessousConversion Nested JSON en notation point JSON

{ 
    "id": "123", 
    "name": "John" 
} 

Je consume l'appel de repos à l'aide HttpClient et convertit la chaîne JSON à Map<String, String> comme comme le montre au dessous de.

String url= "http://www.mocky.io/v2/5979c2f5110000f4029edc93"; 
HttpClient client = HttpClientBuilder.create().build(); 
HttpGet httpGet = new HttpGet(url); 
httpGet.setHeader("Content-Type", "application/json"); 
HttpResponse httpresponse = client.execute(httpGet); 
String response = EntityUtils.toString(httpresponse.getEntity()); 

ObjectMapper mapper = new ObjectMapper(); 
Map<String, String> map = mapper.readValue(response, new TypeReference<Map<String, String>>(){}); 

La conversion de chaîne JSON à HashMap fonctionne très bien, mais en fait mon exigence était parfois il peut y avoir une certaine JSON imbriqué dans le principal JSON, par exemple dans le ci-dessous JSON j'ai une clé address supplémentaire qui est encore un json imbriqué ayant city et town détails.

{ 
    "id": "123", 
    "name": "John", 
    "address": { 
    "city": "Chennai", 
    "town": "Guindy" 
    } 
} 

Si JSON imbriquée est que je dois la faire JSON comme comme indiqué ci-dessous

{ 
    "id": "123", 
    "name": "John", 
    "address.city": "Chennai", 
    "address.town": "Guindy" 
} 

Actuellement, je suis en utilisant la bibliothèque jackson, mais ouvert à toute autre bibliothèque qui me donnera cette fonction sur box

Quelqu'un peut-il m'aider en donnant une suggestion à ce sujet.

Répondre

2

Voici une méthode récursive qui aplatit une carte imbriquée avec n'importe quelle profondeur à la notation par points souhaitée. Vous pouvez passer à Jackson ObjectMapper pour obtenir la sortie JSON souhaitée:

@SuppressWarnings("unchecked") 
public static Map<String, String> flatMap(String parentKey, Map<String, Object> nestedMap) 
{ 
    Map<String, String> flatMap = new HashMap<>(); 
    String prefixKey = parentKey != null ? parentKey + "." : ""; 
    for (Map.Entry<String, Object> entry : nestedMap.entrySet()) { 
     if (entry.getValue() instanceof String) { 
      flatMap.put(prefixKey + entry.getKey(), (String)entry.getValue()); 
     } 
     if (entry.getValue() instanceof Map) { 
      flatMap.putAll(flatMap(prefixKey + entry.getKey(), (Map<String, Object>)entry.getValue())); 
     } 
    } 
    return flatMap; 
} 

Utilisation:

mapper.writeValue(System.out, flatMap(null, nestedMap)); 
+0

@SharaonBenAsher Merci pour la réponse, ne nous avons cette fonctionnalité dans une bibliothèque de la boîte –

+0

pas à ma connaissance –

+0

mais comment je vais identifier le json imbriqué dans le json principal ...... devrais-je itérer le json principal et vérifier pour json imbriqué ..... Pouvez-vous me donner un exemple –