JOLT嵌套数组过滤需求:筛选仅含ACTIVE状态的PrivateInfo
JOLT 转换实现方案
输入 JSON
{ "Users": [ { "ID": "1", "TD": [{"serial": 112}], "HD": ["FFA", "FFB"], "LD": "12", "PrivateInfo": [ {"InfoId": "ID1-II1", "statuses": ["ACTIVE"]}, {"InfoId": "ID1-II2", "statuses": ["ACTIVE", "INACTIVE"]}, {"InfoId": "ID1-II3", "statuses": ["IN_PROGRESS"]} ] }, { "ID": "2", "TD": [{"serial": 156}], "HD": ["FFB"], "LD": "65", "PrivateInfo": [ {"InfoId": "ID2-II1", "statuses": ["ACTIVE", "SUSPENDED"]}, {"InfoId": "ID2-II2", "statuses": ["ACTIVE", "INACTIVE"]}, {"InfoId": "ID2-II3", "statuses": ["IN_PROGRESS"]} ] }, { "ID": "3", "TD": [{"serial": 557}], "HD": ["FFA", "FFC"], "LD": "98", "PrivateInfo": [ {"InfoId": "ID3-II1", "statuses": ["ACTIVE"]}, {"InfoId": "ID3-II2", "statuses": ["ACTIVE"]} ] } ] }
需求回顾
- 对每个User的
PrivateInfo数组,仅保留statuses**仅包含"ACTIVE"**的项(即数组长度为1且元素是"ACTIVE") - 处理后
PrivateInfo为空的User直接移除
JOLT 转换规格
[ { "operation": "shift", "spec": { "Users": { "*": { "ID": "Users.[&1].ID", "TD": "Users.[&1].TD", "HD": "Users.[&1].HD", "LD": "Users.[&1].LD", "PrivateInfo": { "*": { "statuses": { "1": { "ACTIVE": { "@2": "Users.[&5].PrivateInfo[]" } } } } } } } } }, { "operation": "modify-overwrite-beta", "spec": { "Users": "=filter($, function($v) { return !isEmpty($v.PrivateInfo); })" } } ]
转换说明
Shift 操作:
- 遍历每个User,保留
ID、TD、HD、LD原有字段 - 对
PrivateInfo的每个元素,嵌套判断:先检查statuses数组长度是否为1,再判断元素是否为"ACTIVE",满足条件的项才存入新的PrivateInfo数组
- 遍历每个User,保留
Modify-overwrite-beta 操作:
- 用
filter函数过滤Users数组,仅保留PrivateInfo不为空的User对象
- 用
输出结果
{ "Users": [ { "ID": "1", "TD": [{"serial": 112}], "HD": ["FFA", "FFB"], "LD": "12", "PrivateInfo": [{"InfoId": "ID1-II1", "statuses": ["ACTIVE"]}] }, { "ID": "3", "TD": [{"serial": 557}], "HD": ["FFA", "FFC"], "LD": "98", "PrivateInfo": [ {"InfoId": "ID3-II1", "statuses": ["ACTIVE"]}, {"InfoId": "ID3-II2", "statuses": ["ACTIVE"]} ] } ] }
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

