如何使用JOLT Notation替换JSON值并完成指定代码映射
JOLT规则修改:实现data数组code字段的映射转换
现有一套JOLT转换规则,除无法将data数组中的code字段替换为输出JSON指定的名称(如tsa对应A1-T1等)外,其余转换逻辑均可正常运行。以下是修改后的规则及相关说明:
输入JSON
{ "sid": "1", "poste": "MapRecord[{altitude=473.0, latitude=49.92665, poste=Libramont, longitude=5.36080}]", "mtime": "2023-07-12T01:00:00Z", "tsa": "17.2", "hra": "90.2", "tsf": "15.8", "tss": "21.4", "ens": "0.0", "dvt": "319.6", "vvt": "0.9", "plu": "0.0", "hct": "60.0" }
目标输出JSON
{ "Date": "2023-07-12 01:00:00", "stationname": "Libramont", "data": [ { "code": "A1-T1", "value": "17.2" }, { "code": "A1-ETP1", "value": "16.2" }, { "code": "A1-HR1", "value": "90.2" }, { "code": "A1-TSF", "value": "15.8" }, { "code": "A1-P1-T1", "value": "21.4" }, { "code": "A1-PY1", "value": "0.0" }, { "code": "A1-DVT", "value": "319.6" }, { "code": "A1-WS1", "value": "0.9" }, { "code": "A1-R1", "value": "0.0" }, { "code": "A1-HCT", "value": "60.0" } ] }
现有JOLT规则
[ { "operation": "modify-overwrite-beta", "spec": { "po1": "=split('poste=',@(1,poste))", "po2": "=lastElement(@(1,po1))", "po3": "=split(',',@(1,po2))", "stationname": "=firstElement(@(1,po3))" } }, { "operation": "remove", "spec": { "po*": "" } }, { "operation": "shift", "spec": { "mtime": "Date", "sta*": "&", "sid": "&", "*": "data.&" } }, { "operation": "shift", "spec": { "Date|stationname": "&", "data": { "*": { "$": "&2[#2].code", "@": "&2[#2].value" } } } }, { "operation": "modify-overwrite-beta", "spec": { "data": { "*": { "value": [ "=notNull", 0 ] } }, "DPortion1": "=substring(@(1,Date),0,10)", "DPortion2": "=substring(@(1,Date),11,19)", "Date": "=concat(@(1,DPortion1),' ',@(1,DPortion2))" } }, { // get rid of the DPortion parameters "operation": "remove", "spec": { "DPortion*": "" } } ]
修改后的JOLT规则
[ { "operation": "modify-overwrite-beta", "spec": { "po1": "=split('poste=',@(1,poste))", "po2": "=lastElement(@(1,po1))", "po3": "=split(',',@(1,po2))", "stationname": "=firstElement(@(1,po3))", "etp": "16.2" } }, { "operation": "remove", "spec": { "po*": "" } }, { "operation": "shift", "spec": { "mtime": "Date", "stationname": "&", "sid": "&", "tsa": "data.A1-T1", "hra": "data.A1-HR1", "tsf": "data.A1-TSF", "tss": "data.A1-P1-T1", "ens": "data.A1-PY1", "dvt": "data.A1-DVT", "vvt": "data.A1-WS1", "plu": "data.A1-R1", "hct": "data.A1-HCT", "etp": "data.A1-ETP1" } }, { "operation": "shift", "spec": { "Date|stationname": "&", "data": { "*": { "$": "&2[#2].code", "@": "&2[#2].value" } } } }, { "operation": "modify-overwrite-beta", "spec": { "data": { "*": { "value": [ "=notNull", 0 ] } }, "DPortion1": "=substring(@(1,Date),0,10)", "DPortion2": "=substring(@(1,Date),11,19)", "Date": "=concat(@(1,DPortion1),' ',@(1,DPortion2))" } }, { "operation": "remove", "spec": { "DPortion*": "" } } ]
修改说明
- 在
modify-overwrite-beta步骤中新增etp字段,对应输出中A1-ETP1的默认值16.2(输入JSON无该字段)。 - 调整第一个
shift操作的data映射逻辑,替换原通配符*为每个输入字段的明确映射(如tsa对应data.A1-T1),确保后续生成的code字段直接使用目标名称。 - 保留原有所有正常逻辑,包括stationname提取、Date格式转换、值非空处理等。
内容的提问来源于stack exchange,提问作者BHADRAKA HERATH
相关产品推荐
相关产品推荐

