基于ContactType字段值的Jolt JSON转换实现求助
用Jolt根据ContactType值转换JSON结构
输入JSON
{ "root": { "entities": [ { "fields": [ { "name": "ContactType", "value": "Company" }, { "name": "HandlerName", "value": "XYZ" }, { "name": "Reference", "value": "123-4443" }, { "entities": [ { "parent": { "fieldName": "DefendantAddress" }, "fields": [ { "name": "Address", "value": "1662369113138 Somewhere Street" }, { "name": "PostalCode", "value": "XXXXX" } ] } ], "name": "DefendantAddress" } ] } ] } }
转换需求
根据ContactType字段的值生成不同结构的输出:
- 当
ContactType为Company时,输出:
{ "HandlerName": "XYZ", "reference": "123-4443", "companyDetails": { "address": "1662369113138 Somewhere Street", "postalCode": "XXXXX" } }
- 当
ContactType为Person时,输出:
{ "HandlerName": "XYZ", "reference": "123-4443", "personDetails": { "address": "1662369113138 Somewhere Street", "postalCode": "XXXXX" } }
现有Jolt Spec(待完善)
目前已能判断ContactType的值,但无法导航到子实体获取地址信息,现有Spec如下:
[ { "operation": "shift", "spec": { "root": { "entities": { "*": { "fields": { "*": { "name": { "HandlerName": { "@(2,value)": "handlerName" }, "Reference": { "@(2,value)": "reference" }, "ContactType": { "@(2,value)": { "Company": { ????? } } } } } } } } } } } ]
完整解决方案
要导航到子实体的地址信息,需要使用Jolt的相对路径引用(@符号)定位到DefendantAddress下的子实体字段,同时通过动态键名实现根据ContactType生成不同的详情节点名。
完整的Jolt Spec如下:
[ { "operation": "shift", "spec": { "root": { "entities": { "*": { "fields": { // 提取HandlerName和Reference "*": { "name": { "HandlerName": { "@(2,value)": "HandlerName" }, "Reference": { "@(2,value)": "reference" } } }, // 定位到DefendantAddress的子实体字段 "*": { "name": { "DefendantAddress": { "@(2,entities)": { "*": { "fields": { "*": { "name": { "Address": { "@(2,value)": "@(6,fields[0].value)Details.address" }, "PostalCode": { "@(2,value)": "@(6,fields[0].value)Details.postalCode" } } } } } } } } } } } } } } }, // 转换键名大小写(CompanyDetails -> companyDetails) { "operation": "modify-overwrite-beta", "spec": { "companyDetails": "=toLower(@(1,CompanyDetails))", "personDetails": "=toLower(@(1,PersonDetails))" } }, // 清理临时生成的大写键名 { "operation": "remove", "spec": { "CompanyDetails": "", "PersonDetails": "" } } ]
关键逻辑说明
- 动态键名生成:
@(6,fields[0].value)表示向上回溯6层,获取fields数组第一个元素(ContactType字段)的value值,以此生成CompanyDetails或PersonDetails临时键名。 - 子实体导航:通过
@(2,entities)定位到DefendantAddress下的子实体数组,再逐层提取Address和PostalCode的值。 - 分步处理:先提取所有字段生成临时大写键,再转换为目标小写键,最后清理临时键保证输出结构正确。
内容的提问来源于stack exchange,提问作者AnuragT
相关产品推荐
相关产品推荐

