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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在任何级别的json文档上按键获取值?相关的知识,希望对你有一定的参考价值。

我编写解析字符串的方法。我知道字符串有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;
}

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

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

答案

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

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检查减少到仅在方法返回值时,而不是在我们尝试从映射中获取值时。

以上是关于如何在任何级别的json文档上按键获取值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在任何级别递归更改JS Object / JSON值?

如何在android中将json数据加载到片段中

从片段中的json获取值

如何获取自己键盘上按键的键值(KeyCode)

text 递归搜索JSON数组 - 按键获取值

如何从片段中的 JSON 响应中的对象获取数据