如何在任何级别的json文档上按键获取值?

问题描述 投票:0回答:1

我编写解析字符串的方法。我知道字符串有json格式。

另外我知道它包含latlng的值,但它可以在任何级别。

我编写了以下代码来实现按键获取值:

Map jsonBodyMap = objectMapper.convertValue(body, Map.class);
String lat = getByKey(jsonBodyMap, "lat");



private String getByKey(Map<?, ?> map, String key) {
    Object value = map.get(key);
    if (value != null) {
        return String.valueOf(value);
    }
    for (Map.Entry entry : map.entrySet()) {
        Object entryValue = entry.getValue();
        if (entryValue instanceof Map) {
            String val = getByKey((Map) entryValue, key);
           if (val != null) {
                return val;
            }
        }
    }
    return null;
}

但它看起来不是一个很好的解决方案。

你知道更好的实现方法吗?

java json dictionary search jackson
1个回答
0
投票

通过对方法和流稍作修改,您可以创建一个由两部分组成的递归函数。

private static String getByKey(Object obj, String key) {
    if(obj instanceof Map) {
        Map<?,?> map = (Map) obj;

        if(map.containsKey(key))
            return String.valueOf(map.get(key));

        return map.entrySet().stream()
                .map(a -> getByKey(a.getValue(), key))
                .filter(a -> a != null)
                .findAny()
                .orElse(null);

    }
    return null;
}

我们不是在Map上利用这个方法,而是利用一个对象,必要时将其转换为一个映射,然后如果它是一个Map则在其上传递递归函数。这会将null检查减少到仅在方法返回值时,而不是在我们尝试从映射中获取值时。

© www.soinside.com 2019 - 2024. All rights reserved.