importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONArray;importcom.alibaba.fastjson.JSONObject;importjava.io.IOException;importjava.util.ArrayList;importjava.util.Collections;importjava.util.List;importjava.util.regex.Pattern;public classTest {public static void main(String[] args) throwsIOException {
String jsonStr= "{\"job\":{\"content\":[{\"reader\":{\"name\":{\"a\":\"b\"}}}]}}";
String keyPath= "job.content[0].reader.name.a";
Object json=getJsonString(jsonStr, keyPath);
System.out.println(json);
}//判断一个字符串是不是数字
public static booleanisInteger(String str) {
Pattern pattern= Pattern.compile("^[-\\+]?[\\d]*$");returnpattern.matcher(str).matches();
}//将keyPath分割成数组
public staticString[] customSplit(String oldStr) {
List strings = new ArrayList<>();
String[] split= oldStr.split("\\.");for(String s : split) {if (s.contains("[")) {
String[] subS= s.split("\\[|\\]");
Collections.addAll(strings, subS);
}else{
strings.add(s);
}
}return strings.toArray(new String[0]);
}//最终的value不一定是string,但返回string具有最大的普适性,相比返回JSON或Object更方便使用
public staticString getJsonString(String jsonStr, String keyPath) {
String[] keyArray=customSplit(keyPath);
JSON curResult= null;
JSON curJson;if (isInteger(keyArray[0])) {
curJson=JSON.parseArray(jsonStr);
}else{
curJson=JSON.parseObject(jsonStr);
}for (int i = 0; i < keyArray.length; i++) {int j = i + 1;//判断父Json当前类型,JSONObject
if (curJson instanceofJSONObject) {//判断子Json类型,分两种情况,最后一个key是无法确认其value类型的,默认返回string
if (j ==keyArray.length) {return((JSONObject) curJson).getString(keyArray[i]);
}//如果不是最后一个key,可以根据其后的key的类型来判断当前key对应的value类型
if(isInteger(keyArray[j])) {
curResult=((JSONObject) curJson).getJSONArray(keyArray[i]);
}else{
curResult=((JSONObject) curJson).getJSONObject(keyArray[i]);
}
}//判断父Json当前类型,JSONArray
else{//判断子Json类型,最后一个key默认返回string
if (j ==keyArray.length) {return((JSONArray) curJson).getString(Integer.parseInt(keyArray[i]));
}if(isInteger(keyArray[j])) {
curResult=((JSONArray) curJson).getJSONArray(Integer.parseInt(keyArray[i]));
}else{
curResult=((JSONArray) curJson).getJSONObject(Integer.parseInt(keyArray[i]));
}
}
curJson=curResult;
}returncurResult.toJSONString();
}