2017-08-31 3 views
1

J'ai json qui ressemble à ci-dessous. Je voudrais obtenir une sortie qui contient une ligne pour chaque enregistrement de minuterie, mais inclut le nom du service.jq obtenir chaque valeur dans le tableau avec le parent

{ 
    "services":{ 
     "service":[ 
     { 
      "name":"Test Value", 
      "timer":[ 
       { "datetime":"08/30/2017 16:33:35", "value":"625" }, 
       { "datetime":"08/30/2017 16:22:38", "value":"240" } 
      ] 
     }, 
     { 
      "name":"Test Value 2", 
      "timer":[ 
       { "datetime":"08/30/2017 16:07:38", "value":"432" }, 
       { "datetime":"08/30/2017 15:59:07", "value":"1355" } 
      ] 
     } 
     ] 
    } 
} 

Je suis venu avec .services.service[].name as $name | .services.service[].timer | map([ $name, .datetime, .value ]), qui me fait

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]] 
[["Test Value","08/30/2017 16:07:38","432"],["Test Value","08/30/2017 15:59:07","1355"]] 
[["Test Value 2","08/30/2017 16:33:35","625"],["Test Value 2","08/30/2017 16:22:38","240"]] 
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]] 

La sortie que je me attends serait

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]] 
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]] 

Mais remarquez que les valeurs sont dupliqués pour les services et jeux de minuteries. Qu'est-ce que je rate?

Répondre

2

.services.service[]|[{name,timer:.timer[]}|[.name,.timer[]]] vous donnera votre sortie attendue,

.services.service[]|{name,timer:.timer[]}|[.name,.timer[]] (sans agrégation de tableau) vous donnera un résultat pour chaque minuterie:

["Test Value","08/30/2017 16:33:35","625"] 
["Test Value","08/30/2017 16:22:38","240"] 
["Test Value 2","08/30/2017 16:07:38","432"] 
["Test Value 2","08/30/2017 15:59:07","1355"] 

Qu'est-ce que vous avez manqué dans votre tentative est

L'expression exp en $ x | ... signifie: pour chaque valeur de l'expression exp, exécutez le reste du pipeline avec l'intégralité de l'entrée d'origine et avec $ x défini sur cette valeur. Ainsi fonctionne comme quelque chose d'une boucle foreach.

Si vous voulez vraiment utiliser des variables que vous devez faire comme ceci: .services.service[]| .name as $name | .timer | map([ $name, .datetime, .value ])

0

Je pense qu'il serait utile d'essayer de le visualiser en termes de niveaux de vos données est dans, et où vous Je veux que ce soit dans votre résultat. Lors de l'aplatissement d'une hiérarchie de données, je trouve plus facile de penser à prendre des valeurs dans un niveau et à les combiner avec les valeurs du niveau suivant. Donc, en regardant les objets de service individuels, vous voulez prendre le nom, et le combiner avec les propriétés de ses objets de minuterie, et produire un résultat pour chaque combinaison. Alors commencez là:

[.name] + (properties of the timer objects) 

Ensuite, vous devez générer le properties of the timer objects.

.timer[] | [.datetime, .value] 

Vous pouvez lire ceci comme: « pour chaque élément du tableau timer, créez un tableau comprenant les datetime et value propriétés. » Une fois que vous obtenez tout au même niveau, vous pouvez réorganiser les valeurs si vous le souhaitez, mais heureusement, dans notre cas, tout est là où nous les voulons.

Mis ensemble, cette expression produit des tableaux individuels du nom, du datetime et des valeurs, mais vous souhaitez les collecter dans un tableau. Alors mettez-les dedans.

[[.name] + (.timer[] | [.datetime, .value])] 

Lorsque vous mettez tout cela ensemble, vous obtiendrez votre résultat.

.services.service[] | [[.name] + (.timer[] | [.datetime, .value])] 
1

Voici une autre solution démontrant les variations du constructeur de tableau. Notez que le placement de [] dans chacun est légèrement différent.Avec vos données, ce filtre

.services.service[] | {name} + .timer[] 

génère un flux unique d'objets

{"name":"Test Value","datetime":"08/30/2017 16:33:35","value":"625"} 
{"name":"Test Value","datetime":"08/30/2017 16:22:38","value":"240"} 
{"name":"Test Value 2","datetime":"08/30/2017 16:07:38","value":"432"} 
{"name":"Test Value 2","datetime":"08/30/2017 15:59:07","value":"1355"} 

ce filtre

.services.service[] | [ {name} + .timer[] ] 

génère des tableaux d'objets pour chaque service

[{"name":"Test Value","datetime":"08/30/2017 16:33:35","value":"625"},{"name":"Test Value","datetime":"08/30/2017 16:22:38","value":"240"}] 
[{"name":"Test Value 2","datetime":"08/30/2017 16:07:38","value":"432"},{"name":"Test Value 2","datetime":"08/30/2017 15:59:07","value":"1355"}] 

cette filtre

.services.service[] | {name} + .timer[] | [.[]] 

génère un flux de matrices

["Test Value","08/30/2017 16:33:35","625"] 
["Test Value","08/30/2017 16:22:38","240"] 
["Test Value 2","08/30/2017 16:07:38","432"] 
["Test Value 2","08/30/2017 15:59:07","1355"] 

et ce filtre

.services.service[] | [ {name} + .timer[] | [.[]] ] 

génère des tableaux de tableaux pour chaque service

[["Test Value","08/30/2017 16:33:35","625"],["Test Value","08/30/2017 16:22:38","240"]] 
[["Test Value 2","08/30/2017 16:07:38","432"],["Test Value 2","08/30/2017 15:59:07","1355"]]