SpEL表达式 简单使用

前言:

{
    "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);

    }
}


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值