You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于同级属性选择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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:29:26