我有像这样的有效载荷
String payload = "{"array":[{"a":"b","c":10},{"a":"b","c":20},{"a":"b","c":30}],"boolean":true,"color":"gold","null":null,"number":123,"object":{"a":"b","c":"d"},"string":"HelloWorld"}";
使用将该字符串有效负载Map为HashMap
Map map = new ObjectMapper().readValue(payload, HashMap.class);
现在,我想添加一个功能,使我能够仅使用传递的String Expression
获取值并执行一些操作。
例如:
doSomething(data, "data.array")
//输出:[{\"a\":\"b\",\"c\":10},{\"a\":\"b\",\"c\":20},{\"a\":\"b\",\"c\":30}]
->作为对象doSomething(data, "data.array.stream().map(item -> item.get('c')).sum()")
//输出:10 + 20 + 30 = 60
我想要实现这样的目标。有没有人能帮帮忙,我怎么才能实现这个目标。
3条答案
按热度按时间jei2mxaa1#
Spel无法理解lambda表达式(->)。
您可以使用Streams,但不使用lambdas。
按照以下答案获得详细解释:https://stackoverflow.com/a/48842973/7972621
e5nqia272#
库Josson仅使用传递的
String Expression
即可获取值并执行某些操作。https://github.com/octomix/josson
反序列化
查询数组节点
输出
通过函数计算数据
输出
xriantvc3#
SPeL
无法理解lambda表达式(->),但有一个隐式方法。您可以注册并使用lambdas作为
SPeL
#functions。您可以通过注册可在表达式字符串中调用的用户定义函数来扩展
SPeL
。使用该方法将该函数注册到StandardEvaluationContext
。我们可以编写一个直接获取
SPeL
代码或包含StandardEvaluationContext
的示例:我添加了两个lambda函数
getMapItem
和toInteger
,并将它们注册到StandardEvaluationContext
中。我重写了您的
"data.array.stream().map(item -> item.get('c')).sum()"
代码以处理如下所示的特殊函数: