jolt 自定义函数实现通用接口结果体返回
背景:因为公司目前有个对接引擎模块,需要做到适配第三方接口返回结果参数。
如:现在我们公司现有的返回结果体如下
{
“code”: 0,
“msg”: “ok”,
“data”:{}
}
A公司的第三方接口返回的结果体为
{
“status”: 200,
“notes”: “ok”,
“trades”:{}
}
B公司的第三方接口返回的结果体为
{
“code”: 1,
“message”: “ok”,
“errors”:null
}
现在的工作就是要实现通用,无论对接的公司返回的结果体是怎么样的,我都能通过配置将其转换为本公司的结果体。
思路如下,我们首先要利用jolt现有的功能将第三方接口结果体的值映射到字段code、msg、data中,这个我们可以用shift来实现,但由于我们公司code为0才是成功,第三方的接口则不然可能是200或1,又或者是其他的什么值,所以我们此时需要一个判断,判断映射后的code值是否为成功,如果成为则设为0。拿A公司接口为例,如果映射后的code值为200,说明此时接口返回结果为成功,我们则将其设为0,否则直接返回。但我没找到jolt提供的比较函数,所以求人不如求己,我打算自己自定义一个
由于jolt支持自定义函数,接下来我们就要动手敲代码。核心代码如下:
package tech.rongxin.oryx.test.jolt;import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import com.bazaarvoice.jolt.ContextualTransform;
import com.bazaarvoice.jolt.SpecDriven;
import com.bazaarvoice.jolt.common.Optional;
import com.bazaarvoice.jolt.common.tree.MatchedElement;
import com.bazaarvoice.jolt.common.tree.WalkedPath;
import com.bazaarvoice.jolt.modifier.OpMode;
import com.bazaarvoice.jolt.modifier.TemplatrSpecBuilder;
import com.bazaarvoice.jolt.modifier.function.Function;
import com.bazaarvoice.jolt.modifier.spec.ModifierCompositeSpec;public class CustomizeTransform implements SpecDriven, ContextualTransform {private final ModifierCompositeSpec rootSpec;public CustomizeTransform(Object spec) {EqualsFunction equalMapping = new EqualsFunction();Map<String,Function> functionsMap = new HashMap<>();// 定义方法名functionsMap.put("equals", equalMapping);functionsMap = Collections.unmodifiableMap(functionsMap);TemplatrSpecBuilder templatrSpecBuilder = new TemplatrSpecBuilder(OpMode.OVERWRITR, functionsMap);rootSpec = new ModifierCompositeSpec(ROOT_KEY, (Map<String, Object>) spec, OpMode.OVERWRITR,templatrSpecBuilder);}@Overridepublic Object transform(Object input, Map<String, Object> context) {Map<String, Object> contextWrapper = new HashMap<>( );contextWrapper.put( ROOT_KEY, context );MatchedElement rootLpe = new MatchedElement( ROOT_KEY );WalkedPath walkedPath = new WalkedPath();walkedPath.add( input, rootLpe );rootSpec.apply( ROOT_KEY, Optional.of( input), walkedPath, null, contextWrapper );return input;}
}
package tech.rongxin.oryx.test.jolt;import com.bazaarvoice.jolt.common.Optional;
import com.bazaarvoice.jolt.modifier.function.Function;public class EqualsFunction implements Function {@Overridepublic Optional<Object> apply(Object... objects) {//定以该方法有三个参数if(objects[0] == null || objects[1] == null || objects[2] == null){return Optional.empty();}如果前两个参数相等,则返回第三个参数的值,否则返回一个参数的值if(objects[0].equals(objects[1])){return Optional.of(objects[2]);}else {return Optional.of(objects[0]);}}
}
//接口返回的结果如下:
{"status": 200,"notes": "ok","trades":"调用成功"
}//编写的表达式如下:
[{"operation": "shift","spec": {"status": "code","notes": "msg","trades": "data"}
}, {"operation": "tech.rongxin.oryx.test.jolt.CustomizeTransform","spec": {"code": "=equals(@(1,code),200,0)"}
}]
以下是测试类
package tech.rongxin.oryx.test;import com.bazaarvoice.jolt.Chainr;
import com.bazaarvoice.jolt.JsonUtils;import java.util.List;public class Test7 {public static void main(String[] args) {List chainrSpecJSON = JsonUtils.jsonToList("[{\n" +"\t\"operation\": \"shift\",\n" +"\t\"spec\": {\n" +"\t\t\"status\": \"code\",\n" +"\t\t\"notes\": \"msg\",\n" +"\t\t\"trades\": \"data\"\n" +"\t}\n" +"}, {\n" +"\t\"operation\": \"tech.rongxin.oryx.test.jolt.CustomizeTransform\",\n" +"\t\"spec\": {\n" +"\t \"code\": \"=equals(@(1,code),200,0)\"\n" +"\t}\n" +"}]");Chainr chainr = Chainr.fromSpec( chainrSpecJSON );Object inputJSON = JsonUtils.jsonToObject("{\n" +" \"status\": 200,\n" +" \"notes\": \"ok\",\n" +" \"trades\":\"调用成功\"\n" +"}");Object transformedOutput = chainr.transform(inputJSON);System.out.println( JsonUtils.toJsonString(transformedOutput) );}
}
返回结果如下
值得注意的是如果想用到我们自定义的函数operation的类型就必须是我们编写的CustomizeTransform类路径
希望这篇文章能对各位有所帮助!!!
jolt 自定义函数实现通用接口结果体返回相关推荐
- 位运算-自定义函数之通用位移
编写一个函数,实现左右循环移位.函数名为move,调用方法为move(value, n).其中value为需要循环位移的数,n为位移的位数.n<0表示为左移:n>0表示为右移.例如,n=4 ...
- Python爬虫笔记——def()自定义函数的几种参数
Python自定义函数是以def开头,空一格之后是这个自定义函数的名称,名称后面是一对括号,括号里放置形参列表,结束括号后面一定要有冒号":",函数的执行体程序代码也要有适当的缩排 ...
- 纷享销客自定义函数:实战100例(全网最全,持续更新...)
自定义函数是纷享低代码能力的实现方案,是纷享销客PaaS能力的重要组成部分,此文档主要提供纷享自定义函数实用案例,交流.咨询自定义函数.API接口相关问题:wangzhifeng@tongdog.co ...
- MySQL自定义函数和存储过程
自定义函数 使用步骤 1.第一步修改结束符号 基本语法格式 :修改结束符号来写一个自定义函数 DELIMITER 新的结束符号比如$$自定义函数 新的结束符号 DELIMITER; 修改结束符号用的就 ...
- DB 查询分析器 方便地创建DB2自定义函数
DB 查询分析器 方便地创建DB2自定义函数 马根峰 (广东联合电子服务股份有限公司, 广州 510300) 摘要 ...
- MATLAB函数判断绝对素数,自定义函数,找出 以内所有素数(质数)并计算它们的和,matlab...
C++,VC2008,问题是 编写一个函数,找出3~1000之内,所有的素数.求高手!我在线等 #include#includevoidf(){//筛法charprime[1001];memset(p ...
- 《手把手陪您学Python》26——自定义函数
在上一篇<手把手陪您学Python>25--列表推导式中,我们学习了推导式的相关概念和使用方法,使用推导式的方法,可以减少代码的输入量.提高可读性,是Python中非常受欢迎的一种形式. ...
- mysql支持自定义函数_MySQL 自定义函数
自定义函数概念 用户自定义函数(user-defined function, UDF)是一种对MySQL扩展的途径, 其用法与内置函数相同. 自定义函数的两个必要条件: 参数 返回值 (只能有一个) ...
- 南大通用数据库-Gbase-8a-学习-26-UDF自定义函数(C、python外部函数)
一.测试环境 名称 值 cpu 12th Gen Intel® Core™ i7-12700H 操作系统 CentOS Linux release 7.9.2009 (Core) 内存 3G 逻辑核数 ...
最新文章
- getLastSql()用法
- #ifdef,#else,#if,#endif (转载)
- 一文读懂 Spring的前世今生
- php关于ob_start('ob_gzhandler')启用GZIP压缩的bug
- 一步步编写操作系统 66 浅析c库函数与系统调用1
- java整体打印二叉树
- Maigo的KM算法讲解
- 马云:搞AI严防叶公好龙;李彦宏:不拥抱AI的公司会死掉
- jquery使用规则
- 管理感悟:可接受的不参加培训的理由
- USBCAN 、便携式 CAN 分析仪 、CAN卡
- STM32串口驱动安装攻略
- 小波变换matlab加密,混沌和小波变换的图像加密压缩算法
- 两个小故事告诉你静下来的力量
- 谈谈本人做广告联盟的经验
- MVC5局部视图的调用
- 【学习体会】aligned_malloc实现内存对齐
- python列表生成器语法_Python 列表生成式\生成器
- 目前最值得入手的蓝牙耳机有哪些?四款高性价比蓝牙耳机推荐
- ADC—应用交付-AX系列