应用与数据集成平台 ROMA CONNECT-配置映射规则:脚本模式
脚本模式
可通过编辑JavaScript脚本来配置源端数据(sourceObj指源表的字段集合对象)和目标端数据(targetObj指目标表的字段集合对象)的Mapping映射关系信息,增强复杂对象的Mapping处理能力。
脚本映射样例:
- 样例模板。
function excute(sourceObj){ //请在此处编写脚本内容, 注意大小写敏感。 //定义目标端数据对象 targetObj = {}; //支持普通的加减乘除运算 targetObj.a= (sourceObj.id * 3 + 1) % 5; //支持js的Math函数 targetObj.b= Math.sqrt(100); //支持类型转换 targetObj.c = Number("3.14"); //支持调用系统的时间函数 targetObj.date = new Date().toLocaleString(); //支持正则表达式 targetObj.fdi = sourceObj.name.replace(/world/i,"fdi"); //支持json转换 var json = JSON.parse(sourceObj.infoJson); targetObj.address = json.address; targetObj.age = json.age; targetObj.sex = json.other.sex; targetObj.hobby = json.other.hobby; //支持条件语句 if(targetObj.hobby == "rap"){ targetObj.ikun = true; }else{ targetObj.ikun = false; } return targetObj; }
- 仅字段映射。
function excute(sourceObject) {//sourceObject即源端传送的数据对象 //请在此处编写脚本内容; var targetObject = {}; targetObject.mqs_id = sourceObject.id;//映射源端数据表中的id字段至目标端字段mqs_id targetObject.mqs_name = sourceObject.name; targetObject.mqs_date = sourceObject.date; targetObject.mqs_date = sourceObject['customized-outdutydate'];//属性带中划线的字段,需要使用中括号进行引用 return targetObject; //targetObject即返回给目标端的数据对象 }
- 目标端数据源类型为API。
API数据类型的目标端需要分别使用三个对象进行传递,对象包含params、headers和body。
function excute(sourceObj) { print("execute js"); print(sourceObj); var targetObj = {}; targetObj.params = {}; targetObj.params.id = sourceObj.uid targetObj.headers = {}; targetObj.headers['X-HW-ID'] = "应用ID"; targetObj.headers['X-HW-APPKEY'] = "应用密钥"; targetObj.body = {}; return obj; }
如果转换的数据存在时间类型。则JS脚本中需参考以下加黑字段修改:编排模式下,目标端数据源类型为API,且使用JS脚本进行数据转换时,会自动先将源端类型为Date的数据类型转换为yyyy-MM-dd HH:mm:ss的字符串类型。例如,源端时间数据为19:55:20,通过JS脚本转换后会变为1970-01-01 19:55:20,而不是预期的19:55:20。其中1970-01-01为系统统一添加的默认值。
如果要目标端要获得指定格式的数据,需要参考下述示例在JS脚本中对时间数据进行转换。
function excute(sourceObj) { /** * 自定义时间格式函数 * @param {format} 时间显示格式 */ Date.prototype.format = function (format) { var date = { "M+": this.getMonth() + 1, "d+": this.getDate(), "h+": this.getHours(), "m+": this.getMinutes(), "s+": this.getSeconds(), "q+": Math.floor((this.getMonth() + 3) / 3), "S": this.getMilliseconds() }; if (/(y+)/i.test(format)) { format = format.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length)); } for (var k in date) { if (new RegExp("(" + k + ")").test(format)) { format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? date[k] : ("00" + date[k]).substr(("" + date[k]).length)); } } return format; }; print("execute js"); print(sourceObj); var targetObj = {}; targetObj.params = {}; targetObj.params.id = sourceObj.uid //对时间格式的数据进行转换时,调用上述自定义的函数进行处理, 抽取时、分、秒部分的数据给目标字段。 //其中下述代码中的HH:mm:ss为时分秒时间的显示格式。如果写为hhmmss,则返回给目标字段的格式不带冒号。 targetObj.params.time = (new Date(sourceObj.time)).format("hh:mm:ss"); targetObj.headers = {}; targetObj.headers['X-HW-ID'] = "应用ID"; targetObj.headers['X-HW-APPKEY'] = "应用密钥"; targetObj.body = {}; return obj; }
- 数据库字段涉及多层json解析。
如果源端数据对象包含的字段涉及多层json对象嵌套,则需要对每一个解析出来的字段使用“[]”引用。
例如如下脚本表示root字段包含id、name、double等多层对象嵌套,则每一个解析的字段需要单独引用。
function excute(sourceObject) { //请在此处编写脚本内容; var targetObject = {}; targetObject.mqs_id = sourceObject["root.id"]; targetObject.mqs_name = sourceObject["root.name"]; targetObject.mqs_double = sourceObject["root.double"]; targetObject.mqs_date = sourceObject["root.date"]; targetObject.mqs_boolean = sourceObject["root.boolean"]; targetObject.mqs_timestamp = sourceObject["root.timestamp"]; targetObject.mqs_time = sourceObject["root.time"]; targetObject.mqs_long = sourceObject["root.long"]; return targetObject; }