代码之家  ›  专栏  ›  技术社区  ›  Hubert Grzeskowiak

基于子键过滤JSON对象

  •  1
  • Hubert Grzeskowiak  · 技术社区  · 6 年前

    给定以下对象,如何获取包含子对象的所有顶级键 c2 ?

    {
      "a1" : {
        "b" : {
          "c1": {},
          "c2": {}
        }
      },
      "a2" : {
        "b" : {
          "c1" : {}
        }
      },
      "a3" : {
        "b" : {
          "c1" : {},
          "c2" : {}
        }
      } 
    }
    

    预期结果:

    ["a1", "a3"]
    

    我需要JSONPath、JMESPath或ObjectPath语法中的过滤器。

    我尝试了无数的组合 $.*[@.b.c2] 在ObjectPath中 $..[?(b.c2)] @.* | [?contains(keys(@), 'c2')] @.*[b.c2] | @ 在JMESPath中-所有这些都没有用。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Adrian Kalbarczyk    6 年前

    在ObjectPath中,选择器仅对列表起作用,因此$.[@.b.c2]没有任何作用。像您的示例中那样的嵌套对象很少见,所以我没有实现一种方法来完成您需要的操作。您可以尝试将对象转换为如下数组:

    [
      {
        "name": "a1",
        "b": {
          "c1": {},
          "c2": {}
        }
      },
      {
        "name": "a2",
        "b": {
          "c1": {}
        }
      },
      {
        "name": "a3",
        "b": {
          "c1": {},
          "c2": {}
        }
      }
    ]

    然后使用选择器。

    $.*[@.b.c2不为空].name

    另外,请使用Github的最新ObjectPath版本。我刚刚修复了空比较的一些问题。