2017-07-27 145 views
2

我從哪裏得到這樣如下圖所示轉換嵌套的JSON轉換成點符號JSON

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

我消耗使用REST調用的HttpClient和轉換JSON字符串Map<String, String> JSON字符串響應服務像如圖所示下面。

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>>(){}); 

從JSON字符串HashMap的轉換在下面的JSON工作正常,但其實我的要求有時也可以是主JSON中的一些嵌套JSON,比如我有一個額外的address關鍵是再次是具有citytown細節的嵌套json。

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

如果任何嵌套JSON來了,我需要化妝的JSON類似如下圖所示

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

目前我使用傑克遜庫,但是開到,這將給我這個功能超出任何其他庫盒子

任何人都可以通過對此提出一些建議來幫助我。

回答

2

這裏是一個遞歸方法,它將任何深度的嵌套地圖壓扁成所需的點符號。你可以把它傳遞給傑克遜的ObjectMapper以獲得所需的JSON輸出:

@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; 
} 

用法:

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

@SharaonBenAsher感謝您的回答,我們在任何圖書館這個功能開箱 –

+0

不到我的知識 –

+0

,但我將如何確定在主JSON內嵌套的JSON ......我應該迭代主JSON並檢查嵌套的JSON .....你能給我一個例子 –