JSON sortieren
Sortiert Schlüssel alphabetisch durch jedes verschachtelte Objekt, für Diffs, die sauber bleiben.
Nichts, was Sie einfügen, verlässt Ihren Browser. Die connect-src Erlaubnisliste macht daraus eine Garantie des Browsers statt eines Versprechens. Selbst überprüfen
Sortiert Objektschlüssel alphabetisch, rekursiv durch jedes verschachtelte Objekt. Die Reihenfolge von Arrays wird nie angetastet, weil Array-Reihenfolge Bedeutung trägt und die Reihenfolge von Objektschlüsseln nicht.
Der Grund dafür sind Diffs. Zwei Dateien mit demselben Inhalt in anderer Schlüsselreihenfolge erzeugen einen Diff voller Rauschen. Sortieren Sie beide, und der Diff zeigt nur noch, was sich wirklich geändert hat.
Wann Sortieren richtig ist
- Bevor Sie eine generierte Datei committen
- Lock-Dateien, exportierte Konfiguration und alles, was ein Werkzeug schreibt. Garantiert der Generator keine Reihenfolge, macht Sortieren die Datei über Läufe und Maschinen hinweg stabil.
- Bevor Sie zwei Dokumente vergleichen
- Beide zuerst zu sortieren macht aus einem Text-Diff etwas Lesbares. Unser struktureller Diff ignoriert die Schlüsselreihenfolge ohnehin, das hier ist also vor allem für Werkzeuge, die das nicht tun.
- Für eine kanonische Form
- Ein Dokument zu hashen oder zu signieren verlangt eine deterministische Serialisierung. Schlüssel zu sortieren ist ein Teil davon; RFC 8785, das JSON Canonicalization Scheme, legt den Rest fest, samt Zahlenformatierung und String-Escaping.
Wann Sortieren falsch ist
Eine handgepflegte Konfigurationsdatei, in der die Reihenfolge für den Leser Bedeutung trägt: die wichtigen Einstellungen oben, Zusammengehöriges gruppiert. Sie alphabetisch zu sortieren ist technisch harmlos und praktisch ärgerlich.
Alles, wo ein Konsument von der Schlüsselreihenfolge abhängt. Eigentlich sollte das niemand, aber manche selbstgebauten Parser tun es, und das in der Produktion herauszufinden ist teuer.
Wie der Vergleich funktioniert
Standardmäßig wird die Groß- und Kleinschreibung beachtet, was Großbuchstaben vor Kleinbuchstaben einsortiert, weil das ihre Codepoint-Reihenfolge ist. Schalten Sie den Vergleich ohne Beachtung der Schreibweise ein, um die Ordnung zu bekommen, die man von einer Namensliste erwartet.
Beachten Sie, dass dies eine Sortierung nach Codepoint ist und keine gebietsschemaabhängige. Sie ist überall deterministisch, und genau das braucht eine kanonische Form; eine gebietsschemaabhängige Sortierung würde auf verschiedenen Maschinen verschiedene Dateien erzeugen.
How to do this in code
Schlüssel im Code sortieren.
sh jq
-S wirkt auf jeder Ebene, nicht nur auf der obersten.
jq -S . input.json # sort keys, recursively
jq -S -c . input.json # sorted and compact py Python
import json
# sort_keys applies recursively
out = json.dumps(json.loads(text), sort_keys=True, indent=2) js JavaScript
In JavaScript gibt es kein eingebautes sortiertes stringify - deshalb wird dieser Schnipsel so oft weitergereicht.
// The replacer only receives keys, so sorting needs a walk.
function sortDeep(value) {
if (Array.isArray(value)) return value.map(sortDeep);
if (value && typeof value === 'object') {
return Object.fromEntries(
Object.keys(value).sort().map((k) => [k, sortDeep(value[k])]),
);
}
return value;
}
const out = JSON.stringify(sortDeep(JSON.parse(text)), null, 2); go Go
Das ist einer der seltenen Fälle, in denen die Standardbibliothek ungefragt das Richtige tut.
// encoding/json sorts map keys automatically when marshalling
// a map. Struct fields keep their declaration order.
var v map[string]any
json.Unmarshal(data, &v)
out, _ := json.MarshalIndent(v, "", " ") // keys sorted Häufige Fragen
- Verändert Sortieren meine Daten?
- Semantisch nicht. JSON-Objekte sind laut Spezifikation ungeordnet, ein sortiertes Dokument hält also denselben Wert. Es verändert die Bytes, und genau darum geht es.
- Warum werden Array-Elemente nicht sortiert?
- Weil die Reihenfolge eines Arrays Teil der Daten ist. Aus [3,1,2] ein [1,2,3] zu machen würde das Dokument verändern, nicht umformatieren.
- Ist das dasselbe wie kanonisches JSON?
- Es ist ein Teil davon. RFC 8785, das JSON Canonicalization Scheme, legt zusätzlich Zahlenformatierung, String-Escaping und Unicode-Normalisierung fest - alles wichtig, sobald Sie das Ergebnis hashen oder signieren.