如何访问嵌套哈希图 java
How do I access nested hashmap java
我有一个
Map<String, Object> response = {
sendResponse = {
return = {
SendResponse = {
txnID = 4fa160ce-638f-4556-9313-afbef543fadd,
emailTypeID = 1020261131,
txnStatusCode = 1,
txnStatusMessage = OK,
status = [
{ CommunicationStatus = {
type = EMAIL,
statusCode = 1,
statusMessage = OK
}
}
]
}
}
}
}
如何从响应映射中提取“statusMessage”。请指教
嵌套对象的运行时类型是LinkedHashMap<K,V>
,状态类型是ArrayList
,里面有LinkedHashMap<K,V>
。
我尝试使用 get() 方法,如下所示,但我遇到了转换警告。
例如:response.get("sendResponse")).get("return")).get("SendResponse").get("status").get(0).get("CommunicationStatus" ).get(statusMessage);
稍微花点时间就好了
Map<String, Object> response = new LinkedHashMap<>(Map.of(
"sendResponse", new LinkedHashMap<>(Map.of(
"return", new LinkedHashMap<>(Map.of(
"SendResponse", new LinkedHashMap<>(Map.of(
"txnId", "4fa160ce-638f-4556-9313-afbef543fadd",
"status", new ArrayList<Object>(List.of(
new LinkedHashMap<>(Map.of(
"CommunicationStatus", new LinkedHashMap<String, Object>(Map.of(
"type", "EMAIL",
"statusMessage", "OK"))))))))))))));
System.out.println(response);
Map<?, ?> sendResponse = (Map<?, ?>) response.get("sendResponse");
Map<?, ?> returnMap = (Map<?, ?>) sendResponse.get("return");
Map<?, ?> sendResponseCapitalS = (Map<?, ?>) returnMap.get("SendResponse");
List<?> status = (List<?>) sendResponseCapitalS.get("status");
Optional<Map<?, ?>> statusEmail = (Optional<Map<?, ?>>) status.stream()
.map(m -> ((Map<?, ?>) m).get("CommunicationStatus"))
.filter(m -> ((Map<?, ?>) m).get("type").equals("EMAIL"))
.findAny();
Optional<Object> statusMessage = statusEmail.map(m -> m.get("statusMessage"));
statusMessage.ifPresent(System.out::println);
我从你的地图上遗漏了一些无趣的部分,应该没什么区别。我正在打印我为您构建的地图,以检查它看起来是否像您的(只遗漏了一些)。上面代码片段的输出是:
{sendResponse={return={SendResponse={txnId=4fa160ce-638f-4556-9313-afbef543fadd,status=[{CommunicationStatus={statusMessage=OK, type=EMAIL}}]}}}}
OK
我正在使用流操作从类型为 EMAIL
的列表中取出地图。请检查这是否符合您的要求。
编辑:你我都观察到了警告类型安全:未检查从可选 到可选 的转换。我找不到摆脱它的好方法。最终打印输出前最后两行的以下变体不显示警告:
Optional<?> statusEmail = status.stream()
.map(m -> ((Map<?, ?>) m).get("CommunicationStatus"))
.filter(m -> ((Map<?, ?>) m).get("type").equals("EMAIL"))
.findAny();
Optional<Object> statusMessage = statusEmail.map(m -> ((Map<?, ?>) m).get("statusMessage"));
然而,他们提供的关于 statusEmail
类型的信息较少,我发现这是一个明显的缺点,这就是为什么我不顾警告而选择发布上面的第一个变体。
我有一个
Map<String, Object> response = {
sendResponse = {
return = {
SendResponse = {
txnID = 4fa160ce-638f-4556-9313-afbef543fadd,
emailTypeID = 1020261131,
txnStatusCode = 1,
txnStatusMessage = OK,
status = [
{ CommunicationStatus = {
type = EMAIL,
statusCode = 1,
statusMessage = OK
}
}
]
}
}
}
}
如何从响应映射中提取“statusMessage”。请指教
嵌套对象的运行时类型是LinkedHashMap<K,V>
,状态类型是ArrayList
,里面有LinkedHashMap<K,V>
。
我尝试使用 get() 方法,如下所示,但我遇到了转换警告。 例如:response.get("sendResponse")).get("return")).get("SendResponse").get("status").get(0).get("CommunicationStatus" ).get(statusMessage);
稍微花点时间就好了
Map<String, Object> response = new LinkedHashMap<>(Map.of(
"sendResponse", new LinkedHashMap<>(Map.of(
"return", new LinkedHashMap<>(Map.of(
"SendResponse", new LinkedHashMap<>(Map.of(
"txnId", "4fa160ce-638f-4556-9313-afbef543fadd",
"status", new ArrayList<Object>(List.of(
new LinkedHashMap<>(Map.of(
"CommunicationStatus", new LinkedHashMap<String, Object>(Map.of(
"type", "EMAIL",
"statusMessage", "OK"))))))))))))));
System.out.println(response);
Map<?, ?> sendResponse = (Map<?, ?>) response.get("sendResponse");
Map<?, ?> returnMap = (Map<?, ?>) sendResponse.get("return");
Map<?, ?> sendResponseCapitalS = (Map<?, ?>) returnMap.get("SendResponse");
List<?> status = (List<?>) sendResponseCapitalS.get("status");
Optional<Map<?, ?>> statusEmail = (Optional<Map<?, ?>>) status.stream()
.map(m -> ((Map<?, ?>) m).get("CommunicationStatus"))
.filter(m -> ((Map<?, ?>) m).get("type").equals("EMAIL"))
.findAny();
Optional<Object> statusMessage = statusEmail.map(m -> m.get("statusMessage"));
statusMessage.ifPresent(System.out::println);
我从你的地图上遗漏了一些无趣的部分,应该没什么区别。我正在打印我为您构建的地图,以检查它看起来是否像您的(只遗漏了一些)。上面代码片段的输出是:
{sendResponse={return={SendResponse={txnId=4fa160ce-638f-4556-9313-afbef543fadd,status=[{CommunicationStatus={statusMessage=OK, type=EMAIL}}]}}}} OK
我正在使用流操作从类型为 EMAIL
的列表中取出地图。请检查这是否符合您的要求。
编辑:你我都观察到了警告类型安全:未检查从可选
Optional<?> statusEmail = status.stream()
.map(m -> ((Map<?, ?>) m).get("CommunicationStatus"))
.filter(m -> ((Map<?, ?>) m).get("type").equals("EMAIL"))
.findAny();
Optional<Object> statusMessage = statusEmail.map(m -> ((Map<?, ?>) m).get("statusMessage"));
然而,他们提供的关于 statusEmail
类型的信息较少,我发现这是一个明显的缺点,这就是为什么我不顾警告而选择发布上面的第一个变体。