如何从嵌套LinkedHashMap结构中正确获取深层的指定属性值
嵌套LinkedHashMap正确取值方法
问题原因
LinkedHashMap本身不支持点分隔的嵌套路径解析,调用get("url")、get("data.images.original.url")时,会把整个字符串当做顶层Map的key去匹配,你的顶层Map中不存在这两个key,因此返回null。- 链式调用编译报错是因为你声明的
response类型为Map<String, Object>,get()方法返回值默认是Object类型,Object类没有get()方法,因此编译器找不到对应方法。
解决方案
方案1:手动逐层强转(无额外依赖)
每一层取值后强制转换为Map<String, Object>类型,最后一层取值后转成字符串即可:
// 逐层取值,可读性更高 Map<String, Object> data = (Map<String, Object>) response.get("data"); Map<String, Object> images = (Map<String, Object>) data.get("images"); Map<String, Object> original = (Map<String, Object>) images.get("original"); String url = (String) original.get("url"); // 也可以合并为单行写法,可读性较低 String url = (String) ((Map<String, Object>) ((Map<String, Object>) ((Map<String, Object>) response.get("data")).get("images")).get("original")).get("url");
注意:建议在强转前增加类型校验,避免嵌套结构不符合预期时抛出
ClassCastException。
方案2:封装通用嵌套取值工具方法
如果需要频繁处理嵌套Map的路径取值,可以封装工具方法自动解析点分隔路径:
/** * 从嵌套Map中根据点分隔路径取值 * @param map 顶层Map * @param path 点分隔的嵌套路径,例如 data.images.original.url * @return 路径对应的值,不存在则返回null */ public static Object getNestedMapValue(Map<String, Object> map, String path) { String[] keyArr = path.split("\\."); Object currentVal = map; for (String key : keyArr) { if (!(currentVal instanceof Map)) { return null; } currentVal = ((Map<?, ?>) currentVal).get(key); } return currentVal; } // 调用示例 String url = (String) getNestedMapValue(response, "data.images.original.url");
内容的提问来源于stack exchange,提问作者Alexey Ananin
相关产品推荐
相关产品推荐

