如何通过Jolt转换从JSON数组的Tagscopy字段中提取键值对
看起来你需要把Tagscopy数组里那些格式有点“别扭”的键值对字符串,转换成每个对象的顶层属性,还要兼容Tags字段可能缺失的情况对吧?我来帮你调整Jolt规格,完美实现你要的效果:
最终可用的Jolt Spec
[ // 第一步:解析Tagscopy中的每个键值对字符串,清理格式并拆分键和值 { "operation": "modify-overwrite-beta", "spec": { "*": { "Tagscopy": { "*": { // 去掉首尾的引号,清理多余的转义引号 "cleaned": "=replaceAll(replaceAll(&, '^\"', ''), '\"$', '')", // 拆分键和值(按": "分割) "splitKV": "=split(': ', @(1,cleaned))", // 提取键和值 "key": "=firstElement(@(1,splitKV))", "value": "=lastElement(@(1,splitKV))" } } } } }, // 第二步:把解析后的键值对提升到对象顶层 { "operation": "shift", "spec": { "*": { // 保留原有字段 "SourceId": "[&1].SourceId", "Tags": "[&1].Tags", "ResourceName": "[&1].ResourceName", // 遍历Tagscopy的每个元素,把key作为新字段名,value作为值 "Tagscopy": { "*": { "key": "[&3].&", "value": "[&3].@(1,key)" } } } } }, // 第三步:移除临时生成的中间字段(如果需要的话) { "operation": "remove", "spec": { "*": { "Tagscopy": "" } } } ]
操作解释
- modify-overwrite-beta阶段:
遍历每个数组元素里的Tagscopy项,先清理字符串首尾的多余引号,再把键值对按:分割开,提取出单独的key和value,解决原数据里字符串带多余引号、转义符的问题。 - shift阶段:
保留所有原有字段(SourceId、Tags、ResourceName)的同时,把Tagscopy里解析好的键值对映射到顶层,用提取出的key作为字段名,value作为对应的值。这里的&3用来定位到最外层的数组元素索引,确保每个键值对都对应到正确的对象上。 - remove阶段:
把临时使用的Tagscopy字段移除,让最终输出更简洁。
测试效果
输入你的示例JSON后,会得到你期望的输出:
[ { "SourceId": "/Apple/bb842437dd4/sourceGroups/ALPHABAT/providers/Mobile.com/phone/isp", "Tags": "Name\": \"OMapplication\",\"Owner\": \"Breily", "Name": "OMapplication", "Owner": "Breily", "ResourceName": "omapps" }, { "SourceId": "/Apple/bb842437dd4/sourceGroups/ALPHABAT/providers/Mobile.com/phone/isp", "Tags": "mobile-source-usage\": \"apple-cloud", "mobile-source-usage": "apple-cloud", "ResourceName": "omapps" } ]
另外,这个规格也兼容Tags字段缺失的情况——如果某个对象里没有Tags或Tagscopy,转换过程不会报错,只会保留其他原有字段。
备注:内容来源于stack exchange,提问作者samrathal
相关产品推荐
相关产品推荐

