Python PYJQ сопоставляет вложенные поля с несколькими полями верхнего уровня

#python #json #mapping #jq

Вопрос:

Я пытаюсь сопоставить некоторые данные json с другой схемой. Моя исходная схема и рассматриваемое поле выглядят следующим образом

 "metrics":[  
  {  
     "type":"active_duration",
     "unit":"s",
     "value":135.0
  },
  {  
     "type":"basal_energy_burned",
     "unit":"kcal",
     "value":2371.7412956
  },
  {  
     "type":"distance",
     "unit":"m",
     "value":1510.36558533
  },
  {  
     "type":"active_energy_burned",
     "unit":"kcal",
     "value":295.203469907
  },
  {  
     "type":"steps",
     "unit":"count",
     "value":1877
  },
  {  
     "type":"energy_burned",
     "unit":"kcal",
     "value":2666.944765507
  }
   ],
 

и желаемый результат

 {
    "valueQuantity" : { "unit" : "count", "value" : 1877} ,
    "category" : "steps"
},
{
    "valueQuantity" : { "unit" : "kcal", "value" : 2666.944765507} ,
    "category" : "energy_burned"
}
....
 

Я пробовал это

 import pyjq

t = pyjq.all("""
    {
        "valueQuantity" : .metrics[] | { "unit" : .unit, "value" : .value} ,
        "category" : .metrics[].type
    }""", data)
 

но проблема в том, что .metrics[] запускает более одного, и в итоге у меня получается 36 строк (вместо 6)
Есть ли способ достичь этого?

Ответ №1:

Предположительно, вы имеете в виду:

 .metrics[] | { "valueQuantity" : { "unit" : .unit, "value" : .value}, "category" : .type }
 

который можно сократить до:

 .metrics[] | { valueQuantity: {unit, value}, category: .type }