如何编写JOLT转换以基于内部字段修改数组中的特定对象
问题:修改Jolt中特定name对应的value字段为大写,且不改动其他对象或字段
需求:定位JSON中name为"Special Value"的对象,将其value字段转为大写,其余字段保持不变。
输入JSON
{ "a": "aa", "b": "bb", "attributes": [ { "groupName": "Group 1", "attribute": [ { "name": "c", "value": "cc" } ] }, { "groupName": "Group 2", "attribute": [ { "name": "e", "value": "ee" }, { "name": "Special Value", "value": "hello" }, { "name": "f", "value": "ff" } ] } ] }
期望输出JSON
{ "a": "aa", "b": "bb", "attributes": [ { "groupName": "Group 1", "attribute": [ { "name": "c", "value": "cc" } ] }, { "groupName": "Group 2", "attribute": [ { "name": "e", "value": "ee" }, { "name": "Special Value", "value": "HELLO" }, { "name": "f", "value": "ff" } ] } ] }
之前的尝试
使用shift操作可以定位到目标字段,但配合modify-overwrite-beta操作时报错,之前的shift Spec如下:
[ { "operation": "shift", "spec": { "attributes": { "*": { "attribute": { "*": { "name": { "Special Value": { "@(2,value)": "test" } } } } } } } } ]
解决方案
要实现只修改目标字段且保留其他所有数据,需结合保留原始结构和针对性修改的逻辑,使用modify-overwrite-beta操作的完整Spec如下:
[ { "operation": "modify-overwrite-beta", "spec": { // 保留所有顶层字段(a、b) "*": "&", "attributes": { "*": { // 保留每个attributes元素的groupName "groupName": "&", "attribute": { "*": { // 匹配name为"Special Value"的对象,修改其value为大写 "name": { "Special Value": { "@(2,value)": "=toUpper" } }, // 保留其他所有字段(非目标对象的name、value,以及目标对象的name) "&": "&" } } } } } } ]
逻辑说明
"*": "&":通配符匹配所有顶层字段,原样保留,确保a、b字段不丢失。- 针对
attributes数组中的每个元素("*"):- 保留
groupName字段不变; - 遍历
attribute数组中的每个对象("*"):- 当对象的
name为"Special Value"时,通过@(2,value)获取当前对象的value值,并用=toUpper转换为大写后覆盖原value; "&": "&"确保所有其他字段(包括非目标对象的完整内容、目标对象的name字段)都原样保留。
- 当对象的
- 保留
执行该Spec后,输出结果与期望完全一致。
内容的提问来源于stack exchange,提问作者Drew Persigehl
相关产品推荐
相关产品推荐

