如何通过JSON Path获取匹配子项的LogicNodeList父节点
JSONPath 获取包含特定子项的父节点
问题场景
我用JSONPath更新字段中的名称引用功能正常,但需要返回该引用对应的父项时,修改路径遇到层级匹配错误。
- 有效更新路径:
$.LogicNodeList[*].compChildren[?(@.diagramName == 'S-DGN-B')].diagramName - 尝试的父项获取路径(执行报错):
$.LogicNodeList[?(@.compChildren[?(@.diagramName == 'S-DGN-B')])]
示例JSON
{ "LogicNodeList": [ { "id": "b61aa8a5-8edd-4207-ab58-ccba83afe67e", "name": "CCS_TOP", "desc": "", "gateType": "gtOr", "rootName": "CCS_TOP", "compChildren": [], "gateChildren": [ "CCS-Trains", "CCS-Supply" ], "isRoot": true }, { "id": "27865e6f-b457-42ff-9303-11c700657212", "name": "CCS-Supply", "desc": "", "gateType": "gtOr", "rootName": "CCS_TOP", "compChildren": [ { "diagramName": "S-DGN-B", "stateValues": [] }, { "diagramName": "C-MOV-1", "stateValues": [] }, { "diagramName": "S-TNK-T1", "stateValues": [] } ], "gateChildren": [], "isRoot": false }, { "id": "6d366c22-5e48-45b5-ac5d-9325a122e451", "name": "CCS-Train-A", "desc": "", "gateType": "gtOr", "rootName": "CCS_TOP", "compChildren": [ { "diagramName": "C-PMP-A", "stateValues": [] }, { "diagramName": "S-DGN-A", "stateValues": [] }, { "diagramName": "C-CKV-A", "stateValues": [] }, { "diagramName": "C-MOV-A", "stateValues": [] } ], "gateChildren": [], "isRoot": false } ] }
解决方案
使用以下JSONPath可以正确获取目标父项:
$.LogicNodeList[?(@.compChildren[*].diagramName == 'S-DGN-B')]
逻辑说明
遍历LogicNodeList中的每个元素,检查该元素的compChildren数组是否存在任意一个子项的diagramName等于'S-DGN-B',满足条件的元素会被完整返回。
原路径报错的原因是:多数JSONPath实现不支持嵌套的[?()]过滤器,内层过滤器会导致上下文混淆,无法正确关联父级元素的判断条件。
期望返回结果
[{ "id": "27865e6f-b457-42ff-9303-11c700657212", "name": "CCS-Supply", "desc": "", "gateType": "gtOr", "rootName": "CCS_TOP", "compChildren": [ { "diagramName": "S-DGN-B", "stateValues": [] }, { "diagramName": "C-MOV-1", "stateValues": [] }, { "diagramName": "S-TNK-T1", "stateValues": [] } ], "gateChildren": [], "isRoot": false }]
内容的提问来源于stack exchange,提问作者runfastman
相关产品推荐
相关产品推荐

