如何在同一查询的JSON对象的JMES路径中返回子节点和父节点属性

时间:2019-06-01 11:02:48

标签: json jmespath

考虑到我们有这个JSON:

{  
   "A":[  
      {  
         "AT":"text"
      },
      {  
         "AT":"text2"
      }
   ],
   "B":[  
      {  
         "name":"text",
         "power":10
      },
      {  
         "name":"text1",
         "power":20
      },
      {  
         "name":"text2",
         "power":40
      }
   ]
}

我想返回“ AT”以及与“ AT”相对应的幂,所以我不想返回“ text1”,而只想返回[["text",10],["text2",40]]。此查询[A[*].AT,B[*].power]返回:[["text","text2"],[10,20,40]]。因此,这并不是我想要的,因为我不需要额外的值:“ text1”中的20。我该如何解决?

编辑:我发现这部分代码root[*].B[?contains(['text','text2'],name)].[name,power][][]返回["text",10,"text2",40],这是很好的结果,但查询不是动态的,因为在包含中我有这个['text','text2 ']并且如果可能的话,我想用嵌套查询替换这部分代码,那我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

我认为这是不可能的,因为据我所知,我们无法在JMES路径广告中存储变量,因此我们不能将数组过滤器中的current-node(@)用作@.B[?contains(@[].A[].AT,name)].[name,power][][]。显然,一旦JMES Path进入节点B,它就不知道从节点A检索信息。您应该对以下查询使用jq:

( .B | map({(.name): .power}) | add ) as $b | .A | map(.AT | [., $b[.]]) | add