使用 Jackson 将 JSON 转换为 Map<String, String>

Convert JSON to Map<String, String> using Jackson

我需要使用 REST API 中的一些数据。它 returns JSON 在正文中的反应是这样的:

{
    "dados": [
        {
            "pessoa": 81,
            "HAB_TAC": " ",
            "NOME_COMPL": "Adriana Corsa",
            "NOME_ABREV": "Adriana Corsa",
            "DT_NASC": "21/02/1993",
            "MUNICIPIO_NASC": "006015",
            "NOME_MUN_NASC": "CURITIBA",
            "UF_MUN_NASC": "PR",
            "IBGE_MUN_NASC": "4106902"
         }, 
         {
            "pessoa": 53,
            "HAB_TAC": " ",
            "NOME_COMPL": "Jose de Oliveira",
            "NOME_ABREV": "Jose de Oliveira",
            "DT_NASC": "14/05/1968",
            "MUNICIPIO_NASC": "008367",
            "NOME_MUN_NASC": "BARRA VELHA",
            "UF_MUN_NASC": "SC",
            "IBGE_MUN_NASC": "4202107"
          }
       ], 
       "quantidade":100
}

除了我有 207 name/value 对每个 'pessoa',而不仅仅是 9.

所以,我想将其转换为我可以使用的东西。

最后一行基本上returns响应中有多少条记录。所以只有当我有超过 0 条记录时我才工作。

之后我需要转换 Map 中的数据 (dados) 部分,然后只使用我想要的数据 - 我真的不想创建 class 来存储所有数据。

到目前为止,我拥有的是:

            var responseStream = response.getEntity().getContent();
            BufferedReader reader = new BufferedReader(new InputStreamReader(responseStream));
            var responseBody = reader.readLine();

            var responseBodyMapper = new ObjectMapper(); //com.fasterxml.jackson.databind.ObjectMapper;

            Map<String, Map<String,Object>> map = responseBodyMapper.readValue(responseBody, Map.class);
            ArrayList<String> innerDataMap = (ArrayList<String>) map.get("dados");
            int responseCount = Integer.parseInt(String.valueOf(map.get("quantidade")));

            if (responseCount > 0){

                for (String line : innerDataMap){ //It throws exception here
                    System.out.println(line); 
                }

            }

抛出的异常是java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class java.lang.String (java.util.LinkedHashMap and java.lang.String are in module java.base of loader 'bootstrap')

所以我显然做错了什么。

我可以从外观上获取数据 (data/quantity) 就好了——尽管我可能没有以 right/optimized 的方式进行操作。但至少它有效。

但我无法找到一种方法来获取内部数据 dados 并将其转换为 Map 以便稍后可以对其进行处理。

我试着用 Kotlin 来做 - 因为我正在尝试学习它,但这意味着它更难。

我已经苦苦挣扎了几个小时。这么简单的事情不可能这么难。

任何人都可以阐明我在这里做错了什么吗?

谢谢。

将您的代码更改为:

...

        Map<String, Object> map = responseBodyMapper.readValue(responseBody, Map.class);
        ArrayList<Map<String, Object>> innerDataMap = (ArrayList<Map<String, Object>>) map.get("dados");
        int responseCount = Integer.parseInt(String.valueOf(map.get("quantidade")));

...

您的顶级对象不仅仅是 Map<String, Object>,因为它还有列表和原语(字符串)。