Converting Nested json into dot notation json

拈花ヽ惹草 提交于 2019-11-28 01:41:37

问题


I have a service from where I get a json string response like as shown below

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

I consume the rest call using HttpClient and converts the json string to Map<String, String> like as shown below.

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

The conversion from json string to HashMap is working fine, but actually my requirement was sometimes there can be some nested json within the main json, for example in the below json I am having an additional address key which is again a nested json having city and town details.

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

If any nested json comes I need the make the json like as shown below

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

Currently I am using jackson library, but open to any other library which will give me this feature out of box

Can anyone help me by giving some suggestion on this.


回答1:


Here is a recursive method that will flatten a nested Map with any depth to the desired dot notation. You can pass it to Jackson's ObjectMapper to get the desired json output:

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

Usage:

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


来源:https://stackoverflow.com/questions/45349516/converting-nested-json-into-dot-notation-json

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!