背景:因为公司目前有个对接引擎模块,需要做到适配第三方接口返回结果参数。

如:现在我们公司现有的返回结果体如下

{
“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 自定义函数实现通用接口结果体返回相关推荐

  1. 位运算-自定义函数之通用位移

    编写一个函数,实现左右循环移位.函数名为move,调用方法为move(value, n).其中value为需要循环位移的数,n为位移的位数.n<0表示为左移:n>0表示为右移.例如,n=4 ...

  2. Python爬虫笔记——def()自定义函数的几种参数

    Python自定义函数是以def开头,空一格之后是这个自定义函数的名称,名称后面是一对括号,括号里放置形参列表,结束括号后面一定要有冒号":",函数的执行体程序代码也要有适当的缩排 ...

  3. 纷享销客自定义函数:实战100例(全网最全,持续更新...)

    自定义函数是纷享低代码能力的实现方案,是纷享销客PaaS能力的重要组成部分,此文档主要提供纷享自定义函数实用案例,交流.咨询自定义函数.API接口相关问题:wangzhifeng@tongdog.co ...

  4. MySQL自定义函数和存储过程

    自定义函数 使用步骤 1.第一步修改结束符号 基本语法格式 :修改结束符号来写一个自定义函数 DELIMITER 新的结束符号比如$$自定义函数 新的结束符号 DELIMITER; 修改结束符号用的就 ...

  5. DB 查询分析器 方便地创建DB2自定义函数

    DB 查询分析器 方便地创建DB2自定义函数                            马根峰             (广东联合电子服务股份有限公司, 广州 510300) 摘要     ...

  6. MATLAB函数判断绝对素数,自定义函数,找出 以内所有素数(质数)并计算它们的和,matlab...

    C++,VC2008,问题是 编写一个函数,找出3~1000之内,所有的素数.求高手!我在线等 #include#includevoidf(){//筛法charprime[1001];memset(p ...

  7. 《手把手陪您学Python》26——自定义函数

    在上一篇<手把手陪您学Python>25--列表推导式中,我们学习了推导式的相关概念和使用方法,使用推导式的方法,可以减少代码的输入量.提高可读性,是Python中非常受欢迎的一种形式. ...

  8. mysql支持自定义函数_MySQL 自定义函数

    自定义函数概念 用户自定义函数(user-defined function, UDF)是一种对MySQL扩展的途径, 其用法与内置函数相同. 自定义函数的两个必要条件: 参数 返回值 (只能有一个) ...

  9. 南大通用数据库-Gbase-8a-学习-26-UDF自定义函数(C、python外部函数)

    一.测试环境 名称 值 cpu 12th Gen Intel® Core™ i7-12700H 操作系统 CentOS Linux release 7.9.2009 (Core) 内存 3G 逻辑核数 ...

最新文章

  1. getLastSql()用法
  2. #ifdef,#else,#if,#endif (转载)
  3. 一文读懂 Spring的前世今生
  4. php关于ob_start('ob_gzhandler')启用GZIP压缩的bug
  5. 一步步编写操作系统 66 浅析c库函数与系统调用1
  6. java整体打印二叉树
  7. Maigo的KM算法讲解
  8. 马云:搞AI严防叶公好龙;李彦宏:不拥抱AI的公司会死掉
  9. jquery使用规则
  10. 管理感悟:可接受的不参加培训的理由
  11. USBCAN 、便携式 CAN 分析仪 、CAN卡
  12. STM32串口驱动安装攻略
  13. 小波变换matlab加密,混沌和小波变换的图像加密压缩算法
  14. 两个小故事告诉你静下来的力量
  15. 谈谈本人做广告联盟的经验
  16. MVC5局部视图的调用
  17. 【学习体会】aligned_malloc实现内存对齐
  18. python列表生成器语法_Python 列表生成式\生成器
  19. 目前最值得入手的蓝牙耳机有哪些?四款高性价比蓝牙耳机推荐
  20. ADC—应用交付-AX系列

热门文章

  1. 易观智库:2015年中国网络视频市场及用户研究
  2. 365天英语口语学习_16,电话留言
  3. 设计多频带的FIR滤波器
  4. 支付宝调用H5支付页面返回6002网络连接错误
  5. View的透明度,设置view透明度setAlpha 及 Alpha透明度渐变动画
  6. 用wxPython编写的HostsTool工具,快捷、方便修改hosts文件
  7. 骆驼命名法 ,匈牙利命名法 和 帕斯卡命名法
  8. 向量法计算平面与直线的交点
  9. (附源码)计算机毕业设计SSM基于智慧农业的水果销售系统
  10. 关于syslog报文的RFC规范