基于动态键获取映射值的Jolt转换问题
问题描述
现有输入JSON:
{ "searchType": "SR", "searchTypeMap": { "SR":"CREDIT_APPLICATION", "SQ":"CREDIT_QUOTATION", "DR": "DIRECTOR_CREDIT_SEARCH" } }
需要根据searchType字段的动态值(运行时可为SR、SQ、DR等),从searchTypeMap中匹配对应值并新增searchTypeValue字段,预期输出如下:
{ "searchType": "SR", "searchTypeValue": "CREDIT_APPLICATION", "searchTypeMap": { "SR":"CREDIT_APPLICATION", "SQ":"CREDIT_QUOTATION", "DR": "DIRECTOR_CREDIT_SEARCH" } }
目前通过硬编码键值SR的Jolt Shift规则可实现需求:
[ { "operation": "shift", "spec": { "*": "&", "searchTypeMap": { "SR": { "@": "searchTypeValue", "@(1,&)": "searchTypeMap.&" }, "*": { "@": "searchTypeMap.&" } } } } ]
但使用动态键@(1,searchType)的规则无法得到预期输出,寻求正确的Jolt转换方案。
正确Jolt转换方案
方案一:两步Shift操作
先提取searchType对应的映射值,再合并原输入的所有字段,具体规则如下:
[ // 第一步:提取目标映射值 { "operation": "shift", "spec": { "searchTypeMap": { "@(1,searchType)": "searchTypeValue" } } }, // 第二步:合并原字段与新生成的searchTypeValue { "operation": "shift", "spec": { "@(0,searchTypeValue)": "searchTypeValue", "@(1,searchType)": "searchType", "@(1,searchTypeMap)": "searchTypeMap" } } ]
方案二:单步Shift操作(更简洁)
通过通配符配合条件判断,在保留所有原有字段的同时动态匹配生成searchTypeValue:
[ { "operation": "shift", "spec": { "*": "&", // 保留原有所有字段 "searchTypeMap": { "*": { "@": "searchTypeMap.&", // 保留searchTypeMap的所有键值对 // 当当前键等于上层的searchType时,赋值给searchTypeValue "$(1,searchType)": { "$": { "@2": "searchTypeValue" } } } } } } ]
内容的提问来源于stack exchange,提问作者Parth Gohel
相关产品推荐
相关产品推荐

