【问题标题】:Converting Nested json into dot notation json将嵌套 json 转换为点符号 json
【发布时间】:2018-01-03 02:35:39
【问题描述】:

我有一个服务,从那里我得到如下所示的 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"
}

目前我正在使用 jackson 库,但开放给任何其他库,它将为我提供开箱即用的此功能

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

【问题讨论】:

    标签: java json jackson2


    【解决方案1】:

    这是一种递归方法,可以将任意深度的嵌套 Map 展平为所需的点表示法。您可以将其传递给 Jackson 的 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));
    

    【讨论】:

    • @SharaonBenAsher 感谢您的回答,我们是否在任何开箱即用的库中都有此功能
    • 但是我将如何识别主 json 中的嵌套 json ......我应该迭代主 json 并检查嵌套 json ......你能给我一个例子吗跨度>
    • 你不需要识别嵌套的 json。您将嵌套的 json 加载到 Map 中,使用上述方法将其展平,您可以将其序列化以获得所需的 json
    • 如果我以对象数组的形式获得响应,我该怎么办
    • 那么你采用这种情况的代码。我给你举了一个例子。更改代码以处理新情况有多难?
    猜你喜欢
    • 2017-06-01
    • 2017-11-22
    • 2018-11-22
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多