求助:基于id实现JOLT中users与status数组的关联映射
JOLT映射解决方案:将availability字符串替换为对应status对象
输入JSON
{ "status": [ { "id": "online", "state": "valid" }, { "id": "busy", "state": "unknown" }, { "id": "any", "state": "unknow", "moreInfo": "unavailable" } ], "users": [ { "title": "foo", "availability": [ "online", "busy" ] }, { "title": "bar", "availability": [ "busy", "any" ] }, { "title": "baz", "availability": [ "any" ] } ] }
期望输出JSON
{ "users": [ { "title": "foo", "availability": [ { "id": "online", "state": "valid" }, { "id": "busy", "state": "unknown" } ] }, { "title": "bar", "availability": [ { "id": "busy", "state": "unknown" }, { "id": "any", "state": "unknow", "moreInfo": "unavailable" } ] }, { "title": "baz", "availability": [ { "id": "any", "state": "unknow", "moreInfo": "unavailable" } ] } ] }
核心需求
把users数组中每个对象的availability数组字符串元素,替换成status数组中id匹配的完整对象。
可用的JOLT Spec
[ // 第一步:将status数组转为以id为键的映射表,方便快速查找 { "operation": "shift", "spec": { "status": { "*": { "id": "statusMap.&", "*": "statusMap.&1.&" } }, "users": "users" } }, // 第二步:遍历users,用映射表中的对象替换availability的字符串 { "operation": "shift", "spec": { "users": { "*": { "title": "users[&1].title", "availability": { "*": { "@(2,statusMap.&)": "users[&3].availability[&1]" } } } } } }, // 第三步:清理临时生成的映射表 { "operation": "remove", "spec": { "statusMap": "" } } ]
步骤拆解
构建status映射表
用shift操作把status数组转换成statusMap对象,每个id作为键,对应的完整状态对象作为值。比如statusMap.online直接对应{"id": "online", "state": "valid"},后续不用再遍历数组找匹配项。替换availability元素
再次用shift操作处理users数组:保留title字段不变,对availability里的每个字符串,通过@(2,statusMap.&)引用statusMap中对应键的对象,替换掉原字符串。这里的引用语法意思是往上回溯2层找到statusMap,用当前字符串值作为键取出对应对象。清理临时数据
最后用remove操作删掉临时的statusMap,只保留最终需要的users数组。
内容的提问来源于stack exchange,提问作者Maeko Thịnh
相关产品推荐
相关产品推荐

