使用 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>
,因为它还有列表和原语(字符串)。
我需要使用 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
到目前为止,我拥有的是:
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>
,因为它还有列表和原语(字符串)。