2014-04-16 3 views
6

ich REST Ausgabe im JSON-Format curl Befehl wie untenjq sortiert KEY und VALUES auf unterschiedliche Weise - wie kann ich sie in der gleichen Reihenfolge aufzählen?

allein KEY Namen bekommen mit:

curl http://test.te:8080/testApp/app/version | jq '.version' | jq '. | keys' 

OUTPUT:

"Archiver-Version", 
"Build-Id", 
"Build-Jdk", 
"Build-Number", 
"Build-Tag", 
"Built-By" 

Erste VALUES allein mit:

curl http://test.te.com:8080/testApp/app/version | jq '.version' | jq '.[]' 

OUTPUT (Beachten Sie, wie die Reihenfolge der Werte nicht entspricht die Reihenfolge der Schlüsselnamen; zB der erste Wert, "[email protected]", ist der Wert für die Schlüssel "Built-By", nicht, wie ich erwarten würde, für den ersten Schlüssel, "Archiver-Version"):

"[email protected]" 
"1634d38" 
"sandbox" 
"02-03-2014-13:41" 
"testApp" 

Ich versuche, die Schlüssel und Werte zuweisen Arrays zu trennen, damit ich über sie iterieren und sie im Tabellenformat anzeigen kann.

Aber diese beiden Befehle sind unterschiedlich sortiert, ich kann die Werte und Schlüssel nicht direkt zuweisen.

Gibt es sowieso eine Änderung der Sortierung von KEYS und VALUES, so dass beide gleich sind?

Antwort

6

jq hat eine Option zum Sortieren der Schlüssel. Siehe http://stedolan.github.io/jq/manual/#Invokingjq

--sort-keys/-S: 

Output the fields of each object with the keys in sorted order. 

jedoch die aktuelle freigegebene Version (1.3) von jq nicht diese Erweiterung noch nicht hat, werden Sie jq über neuesten Code kompilieren müssen von ihm master-Zweig ist. Siehe http://stedolan.github.io/jq/download/, der Abschnitt "Von der Quelle unter Linux oder OS X".

für eine komplette Geschichte und Details dieser Funktion finden Sie Ausgabe # 79 https://github.com/stedolan/jq/issues/79

+1

'-S' /' --SORT-Schlüssel', die in v1.4 verfügbar wurden, gilt nur für Objekte _als Ganzes _, _on output_ - es betrifft nicht wie Funktionen und Operatoren wie 'Schlüssel 'und' [] 'arbeiten, die immer gleich aufzählen - anders - so hilft es hier nicht. – mklement0

5

Sie auch '

$ echo '{"a":0, "b":1}' | jq -c 'to_entries|map([.key, .value])|map(.[])' 
["a",0,"b",1] 
4

Das Problem von jq Stielen kann „Option oder Funktion Objekt Mitglieder nach Namen zu sortieren“ s möglicherweise überraschend Standardverhalten:

  • keys aufzählt die Schlüssel alphabetisch sortiert.
  • .[] listet die Werte auf Basis der Eingabereihenfolge Tasten[1]

Mit anderen Worten: Wenn Sie keys verwenden ein Objekt Schlüssel in einem Durchlauf zu extrahieren und dann .[] zu Extrahieren Sie seine Werte in einem anderen, die entsprechenden Ausgabeelemente möglicherweise nicht übereinstimmen.

jq v1.5 eingeführt, um die keys_unsorted/0-Funktion, die eine einfache Lösung ermöglicht:

# Sample input with unordered keys. 
# Sorting the values results in the same order as sorting the keys, 
# so the output order of values below implies the key enumeration order that was applied. 
json='{ "c":3, "a":1, "b":2 }' 

Drucken Schlüssel in Eingabereihenfolge, unter Verwendung von keys_unsorted/0:

$ echo "$json" | jq -r 'keys_unsorted[]' 
c 
a 
b 

Drucken Werte in Eingabereihenfolge, die [] ausnahmslos tut:

$ echo "$json" | jq -r '.[]' 
3 
1 
2 

Caveat: Bis zur Version v1.3, ergab keine garantierte Aufzählung um (die zugrunde liegende Hash-Tabelle Schlüssel Sortierung verwendet wurde, die eine Implementierung Detail ist) .[] verwendet wird; Wenn Sie immer noch v1.3 verwenden müssen, können Sie den unten gezeigten Ansatz to_entries verwenden.


[v1.3 +]to_entries/0, wie in user2259432's helpful answer verwendet, aufzählt auch die Eigenschaften in Eingabereihenfolge:

# Extract keys 
$ echo "$json" | jq -r 'to_entries | map(.key)[]' 
c 
a 
b 
# Extract values 
$ echo "$json" | jq -r 'to_entries | map(.value)[]' 
3 
1 
2 

Caveat: Prior zu v1.5, to_entries/0 Ausgabe Schlüssel-Wert-Paare in sortiert nach Schlüsselreihenfolge.

Da jedoch to_entries/0 beiden Schlüssel und Werte aufzuzählen verwendet werden, ist es noch eine tragfähige Lösung eine stabile Enumeration Reihenfolge parallel Schlüssel/Wert-Extraktionen, auch in pre-v1.5 Versionen zu erzeugen.


[v1.3+] Wird dagegen, Sie enumerate wollen in sortiert-by-Taste um:

Drucken Schlüssel alphabetisch in Reihenfolge sortiert, mit keys/0:

$ echo "$json" | jq -r 'keys[]' 
a 
b 
c 

Drucken Werte nach alphabetisch sortierten Schlüsseln:

$ echo "$json" | jq -r 'keys[] as $k | .[$k]' 
1 
2 
3 

A Vorbehalt re -S/--sort-keys:

Diese Option gilt nur für ganze Objekte, auf Ausgang:

$ echo "$json" | jq -Sc '.' 
{"a":1,"b":2,"c":3} # Sorted by key 

Es nicht anwenden, wenn Sie einen Operator oder eine Funktion verwenden Zugriff auf die Interna eines Objekts:

$ echo "$json" | jq -S '.[]' # !! -S doesn't apply, because [] always uses input order 
3 
1 
2 

[1] Vor v1.5, keine bestimmten Reihenfolge garantiert wurde, das gleiche Problem führt, jedoch.

Verwandte Themen