如何用JOLT为JSON软件对象添加对应架构的architecture属性
JOLT转换:为软件对象添加架构标识属性
需求说明
为JSON payload中software字段下x86、x64数组内的每个软件对象,新增architecture属性,属性值为该对象所属的架构类型(x86或x64)。
输入JSON
{"name": "T15P-GEN3","software": {"x86": [{"name": "AAA","version": "1.3.4","uninstall": "MsiExec.exe /I{3A969900-CAD5-4FB8-B5D1-1F8D9028C6AA}"},{"name": "BBB","version": "1.1.2","uninstall": "MsiExec.exe /I{102C3B71-22B5-4484-8D1F-1C859CA6EE63}"},{"name": "CCC","version": "1.1.4","uninstall": "MsiExec.exe /I{D65355E4-021A-4B0C-B9A4-9D90F8C0D106}"}],"x64": [{"name": "AAAA (x64)","version": "24.01","uninstall": "'C:\\Program Files\\AAAA\\Uninstall.exe'"},{"name": "BBBB (2023)","version": "5.5.5.2811","uninstall": "MsiExec.exe /I{92EC01FE-5C8D-4D03-B8D1-F0A2AEF14EB3}"},{"name": "CCCC","version": "","uninstall": "C:\\Program Files\\CCCC\\CCCC_x64.exe -?uninstall"}]}}
期望输出JSON
{"name": "T15P-GEN3","software": {"x86": [{"name": "AAA","version": "1.3.4","uninstall": "MsiExec.exe /I{3A969900-CAD5-4FB8-B5D1-1F8D9028C6AA}","architecture": "x86"},{"name": "BBB","version": "1.1.2","uninstall": "MsiExec.exe /I{102C3B71-22B5-4484-8D1F-1C859CA6EE63}","architecture": "x86"},{"name": "CCC","version": "1.1.4","uninstall": "MsiExec.exe /I{D65355E4-021A-4B0C-B9A4-9D90F8C0D106}","architecture": "x86"}],"x64": [{"name": "AAAA (x64)","version": "24.01","uninstall": "'C:\\Program Files\\AAAA\\Uninstall.exe'","architecture": "x64"},{"name": "BBBB (2023)","version": "5.5.5.2811","uninstall": "MsiExec.exe /I{92EC01FE-5C8D-4D03-B8D1-F0A2AEF14EB3}","architecture": "x64"},{"name": "CCCC","version": "","uninstall": "C:\\Program Files\\CCCC\\CCCC_x64.exe -?uninstall","architecture": "x64"}]}}
错误规则分析
你尝试的JOLT规则存在两个问题:
- 未保留根节点的
name属性,导致输出丢失该字段; - 路径引用
&3[].&写法错误,无法正确映射原数组结构,导致软件对象的结构混乱。
正确JOLT转换规则
[ { "operation": "shift", "spec": { "name": "name", "software": { "*": { "*": { "@": "&3.&2[]", "$1": "&3.&2[].architecture" } } } } } ]
规则解释
"name": "name":直接保留根节点的name属性,避免数据丢失;software下的*匹配x86、x64两个架构键,$1用于引用该键名,作为architecture属性的值;- 内层
*匹配数组中的每个软件对象,@代表当前对象,&3.&2[]表示将对象映射到software.原架构键对应的数组中(&3对应software,&2对应当前架构键); $1将上层架构键名(x86/x64)赋值给每个软件对象的architecture属性,实现需求。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

