如何在任何级别的json文档上按键获取值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在任何级别的json文档上按键获取值?相关的知识,希望对你有一定的参考价值。
我编写解析字符串的方法。我知道字符串有json格式。
另外我知道它包含lat
和lng
的值,但它可以在任何级别。
我编写了以下代码来实现按键获取值:
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文档上按键获取值?的主要内容,如果未能解决你的问题,请参考以下文章