如何用Jolt在同数组内复制指定对象并修改键名(带条件)
Jolt规则实现指定条件下的对象复制与修改
需求说明
- 在目标数组内,找到
condition为user-prefs.conditions.rlThreshold的对象,复制一份并将新对象的condition改为user-prefs.conditions.rlThreshold-new - 复制仅在对象的
values包含stoplevel.requested等指定值时执行;如果values是stoplevel.appointment,则不执行复制
输入示例
{ "rules": [ { "condition": "user-prefs.conditions.rlThreshold", "values": ["stoplevel.requested"] }, { "condition": "user-prefs.conditions.rlThreshold", "values": ["stoplevel.appointment"] }, { "condition": "some-other-condition", "values": ["stoplevel.requested"] } ] }
期望输出
{ "rules": [ { "condition": "user-prefs.conditions.rlThreshold", "values": ["stoplevel.requested"] }, { "condition": "user-prefs.conditions.rlThreshold-new", "values": ["stoplevel.requested"] }, { "condition": "user-prefs.conditions.rlThreshold", "values": ["stoplevel.appointment"] }, { "condition": "some-other-condition", "values": ["stoplevel.requested"] } ] }
正确Jolt转换规则
[ { "operation": "shift", "spec": { "rules": { "*": { // 保留原对象到结果数组 "@": "rules[]", // 只处理condition为目标值的对象 "condition": { "user-prefs.conditions.rlThreshold": { // 检查values是否符合复制条件 "@(2,values)": { // 匹配包含stoplevel.requested的values(支持多值场景) "*stoplevel.requested*": { // 构造新对象的condition值 "#user-prefs.conditions.rlThreshold-new": "temp.condition", // 复用原对象的values "@(3,values)": "temp.values", // 将新对象加入结果数组 "$temp": "rules[]" }, // 匹配到stoplevel.appointment时不做任何操作 "*stoplevel.appointment*": {} } } } } } } }, { // 清理临时生成的temp节点 "operation": "remove", "spec": { "temp": "" } } ]
规则解析
- Shift操作核心逻辑:
- 先把所有原数组元素原样保留到
rules[] - 仅针对
condition为user-prefs.conditions.rlThreshold的对象,进一步检查values:- 如果
values包含stoplevel.requested,则构造一个新对象,替换condition值后加入rules[] - 如果
values是stoplevel.appointment,则跳过复制步骤
- 如果
- 先把所有原数组元素原样保留到
- Remove操作:清理转换过程中生成的临时
temp节点,保证输出结构干净
内容的提问来源于stack exchange,提问作者vinayak gupta
相关产品推荐
相关产品推荐

