在Jolt中按指定条件过滤JSON列表的实现方法是否正确?
问题:Jolt实现JSON元素过滤与字段重命名的方案是否正确?
业务场景与需求
我们遇到一个业务场景,需要根据特定条件过滤输入JSON中的元素:筛选出isPreOrder=N且isBackOrder=N的元素,同时对保留字段进行重命名。最终通过两个shift操作的Jolt Spec完成了需求,现确认该实现方式是否正确。
输入JSON
[{ "productId": "10002", "shopifyProductId": "31675487486045", "shopifyInventoryItemId": "33346316861533", "isPreOrder": "N", "isBackOrder": "Y", "computedLastInventoryCount": 7956, "productStoreId": "SG_STORE" }, { "productId": "10003", "shopifyProductId": "31675487486046", "shopifyInventoryItemId": "33346316861536", "isPreOrder": "N", "isBackOrder": "N", "computedLastInventoryCount": 7958, "productStoreId": "SG_STORE" } ]
预期输出
[ { "HC_PRODUCT_ID" : "10003", "INVENTORY_ITEM_ID" : "33346316861536", "PRODUCT_VARIANT_ID" : "31675487486046" } ]
使用的Jolt Spec
[{ "operation": "shift", "spec": { "*": { "isPreOrder": { "N": { "@(2,isBackOrder)": { "N": { "@4": "[]" } } } } } } }, { "operation": "shift", "spec": { "*": { "productId": "[&1].HC_PRODUCT_ID", "shopifyInventoryItemId": "[&1].INVENTORY_ITEM_ID", "shopifyProductId": "[&1].PRODUCT_VARIANT_ID" } } } ]
方案正确性确认
该实现方式是正确的,具体说明:
- 第一个shift操作:通过嵌套条件判断,先匹配
isPreOrder为"N"的元素,再在这些元素中筛选isBackOrder为"N"的项,最后用@4引用原始数组元素(层级计算:从当前"N": {...}层级往上数4层,正好对应数组中的单个元素),将符合条件的元素收集到数组中,完成过滤。 - 第二个shift操作:遍历过滤后的数组元素,将指定字段重命名为目标名称,生成最终预期结构。
另外也可以将两个操作合并为一个shift操作,减少步骤,示例如下:
[{ "operation": "shift", "spec": { "*": { "isPreOrder": { "N": { "@(2,isBackOrder)": { "N": { "@(2,productId)": "[#2].HC_PRODUCT_ID", "@(2,shopifyInventoryItemId)": "[#2].INVENTORY_ITEM_ID", "@(2,shopifyProductId)": "[#2].PRODUCT_VARIANT_ID" } } } } } } }]
这里#2用于计数符合条件的元素,自动生成数组索引,同样可得到预期结果。
内容的提问来源于stack exchange,提问作者Bhavna Gawhade
相关产品推荐
相关产品推荐

