Как получить данные из вложенного LinkedHashMap
А как достать значение "test" отсюда?
Map<String, Object> response = new LinkedHashMap<String, Object>() {{
put("data", new LinkedHashMap<String, Object>() {{
put("images", new LinkedHashMap<String, Object>() {{
put("original", new LinkedHashMap<String, Object>() {{
put("url", "test");
}});
}});
}});
}};
response.get("url") = null
response.get("data.images.original.url") = null
response.get("data").get("images").get("original").get("url")
Compilation failed:
cannot find symbol
symbol: method get(java.lang.String)
location: class java.lang.Object
Как сделать вложенные друг в друга LinkedHashMap оптимальным способом?
Ответы (2 шт):
Автор решения: Alexey Ananin
→ Ссылка
Object url = ((Map<String,Object>) ((Map<String,Object>) ((Map<String,Object>) response.get("data")).get("images")).get("original")).get("url");
Полный и развернутый ответ на англ.SO.
Автор решения: kami
→ Ссылка
чтобы использовать упомянутый в вопросе "синтаксис ключа" response.get("data.images.original.url") можно развернуть вложенные map:
Map<String, Object> tmp = response.entrySet().stream()
.flatMap(entry -> ((Map<String, Object>) entry.getValue()).entrySet().stream()
.collect(Collectors.toMap(
o -> entry.getKey() + '.' + o.getKey(),
Map.Entry::getValue)
).entrySet().stream()
)
.flatMap(entry -> ((Map<String, Object>) entry.getValue()).entrySet().stream()
.collect(Collectors.toMap(
o -> entry.getKey() + '.' + o.getKey(),
Map.Entry::getValue)
).entrySet().stream()
)
.flatMap(entry -> ((Map<String, Object>) entry.getValue()).entrySet().stream()
.collect(Collectors.toMap(
o -> entry.getKey() + '.' + o.getKey(),
Map.Entry::getValue)
).entrySet().stream()
)
.collect(Collectors.toUnmodifiableMap(Map.Entry::getKey, Map.Entry::getValue));
String key = "data.images.original.url";
System.out.println(MessageFormat.format("{0}={1}", key, tmp.get(key)));
Вывод консоли:
data.images.original.url=test