5

我有一个服务,从那里我得到一个 json 字符串响应,如下所示

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

我使用 HttpClient 使用其余调用并将 json 字符串转换Map<String, String>为如下所示。

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键,它又是一个嵌套的 json 具有citytown详细信息。

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

如果有任何嵌套的 json,我需要使 json 如下所示

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

目前我正在使用杰克逊库,但开放给任何其他库,这将给我这个功能开箱即用

任何人都可以通过对此提出一些建议来帮助我。

4

1 回答 1

4

这是一种递归方法,可以将任何深度的嵌套 Map 展平为所需的点表示法。您可以将其传递给 Jackson'sObjectMapper以获得所需的 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));
于 2017-07-27T12:22:44.643 回答