我有一个第三方方法(即InfoEndpoint.html#invoke()),它使用地图(一个地图中的地图......)给我一个对象结构。我想以一种不太难看的方式导航这个数据结构。 :)
这是一个以类似的方式从手册Java方式获取这样的结构中的值的示例" (第17-31行)和#34; Groovy方式" (最后一行):example。
我希望有一些类似于Groovy的方法,但我不会在这里使用Groovy,该项目是纯Java。如果有可能,我真的不想为此编写代码(或太多丑陋的代码);你碰巧知道是否有一个可以帮助我的图书馆吗?
这是一个丑陋的Java解决方案,我不想使用它:
public class MapNavigator {
public static void main(String[] args) {
Map<String, Object> people = new HashMap<>();
Map<String, Object> holmes = new HashMap<>();
Map<String, Object> address = new HashMap<>();
address.put("street", "Baker St");
holmes.put("address", address);
people.put("holmes", holmes);
System.out.println(get(people, "holmes.address.street"));
}
public static Object get(Map<String, Object> map, String path) {
return get(map, Arrays.asList(path.split("\\.")));
}
private static Object get(Map<String, Object> map, List<String> pathElements) {
if (map == null || pathElements.size() == 0) {
return null;
}
else if (pathElements.size() == 1) {
return map.get(pathElements.get(0));
}
else {
String head = pathElements.get(0);
List<String> tail = pathElements.subList(1, pathElements.size());
Object object = map.get(head);
if (object instanceof Map) {
return get((Map<String, Object>) object, tail);
}
else {
return null;
}
}
}
}
答案 0 :(得分:1)
您可以尝试使用Apache Commons JXPath:https://commons.apache.org/proper/commons-jxpath/
它几乎为Java对象实现了XPath,并且具有很多功能。对于您的示例,您可以使用这样的简单查询:
JXPathContext.newContext(map).getValue("holmes/address/street");