2017-10-08 82 views
1

我有一个第三方方法(即InfoEndpoint.html#invoke()),它给了我一个使用地图的对象结构(地图中的地图...)。我想以一种不太难看的方式浏览这个数据结构。 :)在Java中查询嵌套的地图

下面是一个以“手动Java方式”(第17-31行)和“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; 
      } 
     } 
    } 
} 

回答

1

您可以尝试的Apache的JXPath下议院:https://commons.apache.org/proper/commons-jxpath/

它几乎器具的XPath Java对象和有一大堆功能。对于你的例子,你可以使用这样简单的查询:

JXPathContext.newContext(map).getValue("holmes/address/street");