Как вернуть дочерний узел и атрибут родительского узла в одном запросе Путь JMES для объекта JSON - PullRequest
0 голосов
/ 01 июня 2019

Считайте, что у нас есть этот 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]].Так что это не совсем то, что я хочу, потому что мне не нужно дополнительное значение: 20 из "text1".Как я могу это исправить?

РЕДАКТИРОВАТЬ: я нашел эту часть кода @.B[?contains(['text','text2'],name)].[name,power][][] она возвращает ["text",10,"text2",40] это хороший результат, НО запрос не динамика, потому что в содержании у меня есть это ['text ',' text2 '] и я хочу заменить эту часть кода вложенным запросом, если это возможно, так как я могу это сделать?

1 Ответ

1 голос
/ 16 июля 2019

Я не думаю, что это возможно, потому что, как я знаю, мы не можем хранить переменные в JMES Path ad, мы не можем использовать current-node (@) в фильтре массива как @.B[?contains(@[].A[].AT,name)].[name,power][][]. Очевидно, что JMES Path не знает, как извлечь информацию из узла A, как только он попадет в узел B. Вам следует использовать jq с этим запросом:

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

...