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.
'-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