前言:
{
"data":{
"dataList":[
{
"userName":"name"
}
]
},
"code":"200",
"message":"正常"
}
你可能在工作中遇到这样一种情况,在jsonStr,要想获取指定的key值的结果
工作中场景:任务中心微服务-导出,在dubbo泛化调用中,不同的业务线返回的结构可能不同,怎么做到根据不同路径获取数据呢?如上图不是dataList,另一个dubbo返回属性为List,怎么办?是不是想让对方统一下,得到的结果就是别人不会理会你,说我的项目已经上线了,我怎么修改?所以百度看csdn,哈哈,找到一套代码,递归查询,完美!
有一天大佬说,SpEL很简单5行代码解决,你说你不会,要去看看,你各种查资料,最后写出了如下代码
import lombok.experimental.UtilityClass;
import org.springframework.context.expression.EnvironmentAccessor;
import org.springframework.context.expression.MapAccessor;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@UtilityClass
public class Spel {
private static final ConcurrentHashMap<String, Expression> c = new ConcurrentHashMap<>();
@SuppressWarnings("unchecked")
public <T> T exec(final String exp, final Object object) {
final Expression expression = c.computeIfAbsent(exp, k -> new SpelExpressionParser().parseExpression(exp));
final StandardEvaluationContext context = new StandardEvaluationContext(object);
context.addPropertyAccessor(new EnvironmentAccessor());
if (object instanceof Map) {
context.addPropertyAccessor(new MapAccessor());
}
return (T) expression.getValue(context);
}
public static void main(String[] args) {
String el = "student==null?null:student[address]==null?null:student[address][city]";
Map<String, Object> address = new HashMap<>();
address.put("city", "北京");
Map<String, Object> student = new HashMap<>();
student.put("address", address);
Map<String, Object> root = new LinkedHashMap<>();
root.put("student", student);
Object exec1;
Object exec2;
Object exec = exec(el, root);
System.out.println("exec = " + exec);
try {
exec1 = exec("test", root);
System.out.println("exec1 = " + exec1);
} catch (Exception e) {
System.out.println("不存在的key,报错啦");
}
exec2 = exec("[test]", root);
System.out.println("exec2 = " + exec2);
}
}