Как получить данные из вложенного 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

→ Ссылка