JSON中动态key取value值

357 阅读1分钟

描述

从一段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;
}