在Java

时间:2017-10-08 23:18:49

标签: java dictionary

我有一个第三方方法(即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;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您可以尝试使用Apache Commons JXPath:https://commons.apache.org/proper/commons-jxpath/

它几乎为Java对象实现了XPath,并且具有很多功能。对于您的示例,您可以使用这样的简单查询:

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