基于同级属性选择JSON结构:递归筛选propertyType=cloudProperty的节点
解决嵌套JSON中递归筛选特定propertyType节点的问题
我来帮你搞定这个需求!你提到的JSONPath思路方向是对的,但咱们也得考虑到不同库的兼容性问题,同时手动递归的方案会更稳妥,毕竟JSON结构不确定。
一、你的JSONPath表达式分析
你写的jsonpath.query(body, '$..*[?(propertyType=="cloudProperty")]')逻辑上是正确的:
$..*表示从根节点开始递归遍历所有层级的节点[?(propertyType=="cloudProperty")]是过滤条件,筛选出包含propertyType键且值为cloudProperty的节点
不过要注意,不同JSONPath实现的语法可能有细微差异:
- 有些库可能要求用单引号包裹字符串值,比如
[?(propertyType=='cloudProperty')] - 如果你的JSON里存在数组嵌套,部分库可能需要调整表达式来确保遍历到数组内的所有元素
举个Python中使用jsonpath-ng库的示例:
from jsonpath_ng import parse # 假设你的JSON数据存在body变量中 jsonpath_expr = parse('$..*[?(propertyType=="cloudProperty")]') matches = [match.value for match in jsonpath_expr.find(body)]
二、手动递归遍历方案(更稳妥)
因为你不确定JSON的具体格式,手动写递归函数会更灵活,还不依赖第三方库。这里给你一个Python的实现示例:
def extract_cloud_properties(data): """递归遍历嵌套JSON,提取所有propertyType为cloudProperty的结构""" result = [] # 处理字典类型节点 if isinstance(data, dict): # 检查当前节点是否符合条件 if data.get("propertyType") == "cloudProperty": result.append(data) # 递归遍历字典的所有值 for value in data.values(): result.extend(extract_cloud_properties(value)) # 处理数组类型节点 elif isinstance(data, list): # 递归遍历数组中的每个元素 for item in data: result.extend(extract_cloud_properties(item)) # 其他类型(字符串、数字等)直接忽略 return result # 使用示例 # 假设your_json_data是你的嵌套JSON数据 cloud_properties = extract_cloud_properties(your_json_data)
这个函数会:
- 遍历所有字典和数组节点
- 一旦发现某个字典的
propertyType等于cloudProperty,就把它加入结果列表 - 继续递归遍历所有子节点,确保不会漏掉深层嵌套的目标结构
三、两种方案对比
| 方案 | 优点 | 缺点 |
|---|---|---|
| JSONPath | 代码简洁,一行表达式搞定 | 依赖第三方库,语法有差异 |
| 手动递归 | 无依赖,灵活可控 | 代码量稍多,需自己实现 |
你可以根据自己的技术栈和实际场景选择合适的方案~
内容的提问来源于stack exchange,提问作者Jeremy Fisher
相关产品推荐
相关产品推荐

