描述
从一段JSON体中,动态取key对应的value信息且value为字符串类型,如果不存在返回null
例子:
{ "name":{ "age":"14" "sex": "boy" } }
取值的key路径为:name.age ,返回值:14
答案:
/**
* 根据具体的埋点字段从json中递归获取信息
* @param field
* @return
*/
public String getInfoFromMark(String field, Object itemObj){
if(itemObj instanceof String){
return itemObj.toString();
}
JSONObject total = JSONObject.parseObject(JSON.toJSONString(itemObj));
Map<String, Object> map = new HashMap<>();
for (String key : total.keySet()) {
map.put(key, total.get(key));
}
String result = null;
for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {
String k = stringObjectEntry.getKey();
List<String> split = Arrays.stream(field.split("\.")).collect(Collectors.toList());
for (int i = 0; i < split.size(); i++) {
if(itemObj instanceof JSONObject && k.equals(split.get(i))){
JSONObject item = JSONObject.parseObject(JSON.toJSONString(itemObj));
field = String.join(".",split.subList(i+1,split.size()));
result = getInfoFromMark(field, item.get(k));
field = String.join(".",split.subList(i,split.size()));
}
}
}
return result;
}