如何在JOLT Spec中将childId移入payload.*.content.values?
问题
需要将childId移入payload.*.content.values中,具体需求如下:
现有JOLT转换规则,输入JSON包含request对象及多个account对象,当前输出中childId位于payload根节点,期望将其改为每个payload下account节点的content.values中的cOnlineId字段。
现有JOLT Spec
[ { "operation": "shift", "spec": { // set values of the object keys to their accountIds // while taking out the value of request.body.inputAccountId "*": { "request": { "body": { "inputId": "inputId", "service": "sName" } }, "*": { "@": "@2,accountId.&" } } } }, { "operation": "shift", "spec": { "*": { "@2,&": { "familyRole": { "//": "Comment: Based on Family role get the details, familyRole1=Organizer, familyRole2=Guardian, familyRole3=child", "1|2": { "@(2,accountId)": "payload.@(3,accountId).accountId", "@(2,locale)": "payload.@(3,accountId).content.locale", "@(2,onlineId)": "payload.@(3,accountId).content.values.onlineId", "@(2,emailAddresses)": { "*": { "isMain": { "true": { "@(2,address)": "payload.@(7,accountId).destination.emailAddress" } } } }, "@(5,sName)": "payload.@(3,accountId).content.values.sName" } } } }, "inputId": { "*": { "@2,&": { "onlineId": "..payload.childId" } } } } } ]
输入JSON
[ { "request": { "body": { "inputId": "2211", "service": "trial" } } }, { "accountId": "1234", "role": 1, "gender": "f", "signinId": "aa@aa.com", "onlineId": "one" }, { "accountId": "1122", "role": 2, "gender": "f", "signinId": "bb@aa.com", "onlineId": "two" }, { "accountId": "2211", "role": 3, "gender": "f", "signinId": "cc@aa.com", "onlineId": "three" } ]
当前输出
{ "payload" : { "childId" : "three", "1234" : { "accountId" : "1234", "content" : { "values" : { "onlineId" : "one", "sName" : "trial" } } }, "1122" : { "accountId" : "1122", "content" : { "values" : { "onlineId" : "two", "sName" : "trial" } } } } }
期望输出
{ "payload" : { "1234" : { "accountId" : "1234", "content" : { "values" : { "onlineId" : "one", "cOnlineId" : "three", "sName" : "trial" } } }, "1122" : { "accountId" : "1122", "content" : { "values" : { "onlineId" : "two", "cOnlineId" : "three", "sName" : "trial" } } } } }
解决方案
修改后的JOLT Spec如下:
[ { "operation": "shift", "spec": { "*": { "request": { "body": { "inputId": "inputId", "service": "sName" } }, "*": { "@": "@2,accountId.&" } } } }, { "operation": "shift", "spec": { "*": { "@2,&": { "role": { "1|2": { "@(2,accountId)": "payload.@(3,accountId).accountId", "@(2,onlineId)": "payload.@(3,accountId).content.values.onlineId", "@(5,sName)": "payload.@(3,accountId).content.values.sName", "@(4,2211.onlineId)": "payload.@(3,accountId).content.values.cOnlineId" } } } }, "inputId": null } } ]
关键修改说明
- 移除根节点childId生成逻辑:将原
inputId对应的规则设为null,避免payload根节点出现childId字段。 - 复用child的onlineId值:在处理role为1、2的账号时,通过
@(4,2211.onlineId)直接引用accountId为2211的账号的onlineId,将其赋值给每个目标账号的content.values.cOnlineId。 - 匹配输入字段名:原规则中使用的
familyRole与输入里的role字段不匹配,调整为"role"以正确识别角色信息。
内容的提问来源于stack exchange,提问作者pcoder
相关产品推荐
相关产品推荐

