2017-10-08 77 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");