请求提供Jolt转换规则:将特征数组转为带appActivity的AppDetails结构
Jolt数据转换实现
转换规则
- 生成
AppDetails:筛选@type为appDetails的条目,按arrayIndex分组,将同组的name-value映射为AppDetails的属性(其中ID需映射为id); - 关联
appActivity:筛选@type为appActivity且@baseType为appDetails的条目,当appActivity的valueType与AppDetails的arrayIndex匹配时,将这些属性组合为appActivity对象,关联到对应的AppDetails中。
输入数据
{"characteristic": [{"name": "TestRemark","valueType": "string","value": "251700100113","@baseType": "string","@schemaLocation": "string","@type": "AdditionalInfo","arrayIndex": "0"},{"name": "ID","valueType": "string","value": "fffcfdd2-a4e4-461b-81ca-338889a4a50b","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "0"},{"name": "FirstSignInDate","valueType": "string","value": "10:24:54.934","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "0"},{"name": "AppVersion","valueType": "string","value": "1.0","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "0"},{"name": "UserDeviceOSVersion","valueType": "string","value": "1.0","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "0"},{"name": "LastLoginTimestamp","valueType": "string","value": "2026-08-11 17:05:14.855+00","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "0"},{"name": "DeviceModel","valueType": "string","value": "LGE LM-G810","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "0"},{"name": "ID","valueType": "string","value": "fffcfdd2-a4e4-461b-81ca-338889a4a50b","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "1"},{"name": "FirstSignInDate","valueType": "string","value": "10:24:54.934","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "1"},{"name": "AppVersion","valueType": "string","value": "1.0","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "1"},{"name": "UserDeviceOSVersion","valueType": "string","value": "1.0","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "1"},{"name": "LastLoginTimestamp","valueType": "string","value": "2026-08-11 17:05:14.855+00","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "1"},{"name": "DeviceModel","valueType": "string","value": "LGE LM-G810","@baseType": "string","@schemaLocation": "string","@type": "appDetails","arrayIndex": "1"},{"name": "ActivityName","valueType": "0","value": "LocalLogin","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "0"},{"name": "ActivityType","valueType": "0","value": "LocalLogin","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "0"},{"name": "Timestamp","valueType": "0","value": "2022-08-11 18:10:16.779+00","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "0"},{"name": "Status","valueType": "0","value": "SUCCESSFUL","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "0"},{"name": "Description","valueType": "0","value": "MANUAL","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "0"},{"name": "ActivityName","valueType": "1","value": "LocalLogin","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "0"},{"name": "ActivityType","valueType": "1","value": "LocalLogin","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "0"},{"name": "Timestamp","valueType": "1","value": "2022-08-11 18:10:16.779+00","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "0"},{"name": "Status","valueType": "1","value": "SUCCESSFUL","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "0"},{"name": "Description","valueType": "1","value": "MANUAL","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "0"},{"name": "ActivityName","valueType": "0","value": "LocalLogin","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "1"},{"name": "ActivityType","valueType": "0","value": "LocalLogin","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "1"},{"name": "Timestamp","valueType": "0","value": "2022-08-11 18:10:16.779+00","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "1"},{"name": "Status","valueType": "0","value": "SUCCESSFUL","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "1"},{"name": "Description","valueType": "0","value": "MANUAL","@baseType": "appDetails","@schemaLocation": "string","@type": "appActivity","arrayIndex": "1"}]}
预期输出
{"datas": {"AppDetails": [{"id": "fffcfdd2-a4e4-461b-81ca-338889a4a50b","FirstSignInDate": "10:24:54.934","AppVersion": "1.0","UserDeviceOSVersion": "1.0","LastLoginTimestamp": "2026-08-11 17:05:14.855+00","DeviceModel": "LGE LM-G810","appActivity": [{"ActivityName": "LocalLogin","ActivityType": "LocalLogin","Timestamp": "2022-08-11 18:10:16.779+00","Status": "SUCCESSFUL","Description": "MANUAL"},{"ActivityName": "LocalLogin","ActivityType": "LocalLogin","Timestamp": "2026-11-07 15:04:01.363+00","Status": "SUCCESSFUL","Description": "MANUAL"},{"ActivityName": "LocalLogin","ActivityType": "LocalLogin","Timestamp": "2022-08-10 16:05:44.165+00","Status": "SUCCESSFUL","Description": "MANUAL"}]}, {"id": "fffcfdd2-a4e4-461b-81ca-338889a4a50b","FirstSignInDate": "10:24:54.934","AppVersion": "1.0","UserDeviceOSVersion": "1.0","LastLoginTimestamp": "2026-08-11 17:05:14.855+00","DeviceModel": "LGE LM-G810"}]}}
Jolt转换规范
以下是实现上述转换的Jolt规范:
[ // 第一步:筛选并分组appDetails和appActivity { "operation": "shift", "spec": { "characteristic": { "*": { "@type": { "appDetails": { "@(2,arrayIndex)": { "@(3,name)": { "ID": "temp.appDetails.&2.id", "*": "temp.appDetails.&2.&" }, "@(3,value)": "temp.appDetails.&2.@(3,name)" } }, "appActivity": { "@(2,@baseType)": { "appDetails": { "@(2,valueType)": { "@(3,name)": "temp.appActivity.&2.&", "@(3,value)": "temp.appActivity.&2.@(3,name)" } } } } } } } } }, // 第二步:将appActivity按valueType转为数组格式 { "operation": "shift", "spec": { "temp": { "appDetails": { "*": "datas.AppDetails[]" }, "appActivity": { "*": { "*": "temp.appActivityArray.&[]" } } } } }, // 第三步:关联appActivity到对应AppDetails { "operation": "shift", "spec": { "datas": { "AppDetails": { "*": { "*": "datas.AppDetails[&1].&" } } }, "temp": { "appActivityArray": { "*": { "*": "datas.AppDetails[&1].appActivity[]" } } } } }, // 第四步:清理临时字段 { "operation": "remove", "spec": { "temp": "" } } ]
注:该规范先完成
AppDetails的分组构建,再将匹配valueType的appActivity条目组合为数组,最终关联到对应arrayIndex的AppDetails对象中。
内容的提问来源于stack exchange,提问作者Dilip Nagaraja
相关产品推荐
相关产品推荐

