2017-08-31 1 views
1

Ich habe json, die wie folgt aussieht. Ich möchte eine Ausgabe erhalten, die eine Zeile für jeden Timer-Datensatz enthält, aber den Namen des Dienstes enthält.jq bekommen jeden Wert in Array mit Eltern

{ 
    "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" } 
      ] 
     } 
     ] 
    } 
} 

Ich habe mit .services.service[].name as $name | .services.service[].timer | map([ $name, .datetime, .value ]) kommen, die mich

wäre
[["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"]] 

Die Ausgabe, die ich erwarte bekommt

[["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"]] 

Aber beachten Sie, dass die Werte für beide dupliziert Dienstleistungen und Sets von Timern. Was vermisse ich?

Antwort

2

.services.service[]|[{name,timer:.timer[]}|[.name,.timer[]]] geben Sie Ihre erwartete Ausgabe,

.services.service[]|{name,timer:.timer[]}|[.name,.timer[]] (ohne Array-Aggregation) geben Ihnen ein Ergebnis für jeden Timer:

["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"] 

Was Sie in Ihrem Versuch entgehen lassen

Der Ausdruck exp als $ x | ... bedeutet: Führen Sie für jeden Wert von Ausdruck exp den Rest der Pipeline mit der gesamten ursprünglichen Eingabe aus, und setzen Sie $ x auf diesen Wert. Also so etwas wie eine foreach-Schleife.

Wenn Sie wirklich Variablen müssen diese, wie es tun, die Sie verwenden möchten: .services.service[]| .name as $name | .timer | map([ $name, .datetime, .value ])

0

ich denke, es wäre hilfreich, es zu versuchen und visualisieren Sie Ihre Daten in in Bezug auf die Ebenen, und wo Sie will es in deinem Ergebnis haben. Wenn ich eine Hierarchie von Daten flacher mache, finde ich es einfacher zu denken, ob es Werte auf einer Ebene nimmt und sie mit den Werten der nächsten Ebene kombiniert.

Wenn Sie sich also die einzelnen Serviceobjekte ansehen, möchten Sie den Namen übernehmen und ihn mit Eigenschaften seiner Timer-Objekte kombinieren und Ergebnisse für jede Kombination erzeugen. Also starte dort:

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

Dann musst du die properties of the timer objects generieren.

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

können Sie diese Zeilen lesen als: „für jedes Element in dem timer Array, erstellen Sie einen Array aus den datetime und value Eigenschaften.“

Sobald Sie alles auf dem gleichen Niveau haben, können Sie die Werte neu anordnen, wenn Sie wollen, aber glücklicherweise in unserem Fall ist alles da, wo wir sie haben wollen.

Zusammengesetzt erzeugt dieser Ausdruck einzelne Arrays des Namens, datetime und Werte, aber Sie möchten sie in einem Array sammeln. Also setzen Sie sie in.

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

Wenn Sie alles zusammen, erhalten Sie Ihr Ergebnis.

1

Hier ist eine andere Lösung, die Array-Konstruktor-Variationen demonstriert. Beachten Sie, dass die Platzierung von [] in jedem etwas anders ist.Ihre Daten dieses Filter

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

einen einzelnen Strom von Gegenständen erzeugt

{"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"} 

dieses Filter

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

Arrays von Objekten für jeden Dienst erzeugt

[{"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"}] 

Diese Filter

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

erzeugt einen Strom von Arrays

["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"] 

und diesen Filter

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

Arrays von Arrays für jeden Dienst

[["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"]] 
erzeugt
Verwandte Themen