JSON-Objekte vergleichen und geänderte Schlüssel finden
Ein Textvergleich lässt kleine JSON-Änderungen oft unnötig umfangreich wirken, weil Einrückung, Schlüsselreihenfolge und Formatierung die eigentlichen Datenänderungen verdecken.
Im Browser ausführen – kostenlos
Läuft direkt in Ihrem Browser – kostenlos. Ihre Datei verlässt Ihren Browser nicht und wird an keinen Server übertragen.
Dieses Werkzeug vergleicht geparste Werte, trennt hinzugefügte, entfernte und geänderte Schlüssel, durchsucht gemeinsame verschachtelte Objekte und liefert eindeutige JSON-Pointer-Pfade. Arrays behalten ihre Reihenfolge und werden als Ganzes verglichen. Der Vorgang ist deterministisch, benötigt kein Netzwerk und weist Arrays, primitive Werte sowie null auf der obersten Ebene zurück.
Einen strukturellen JSON-Unterschied lesen
Das Ergebnis ordnet Abweichungen drei Sammlungen zu: hinzugefügt, entfernt und geändert. Ein hinzugefügter Eintrag kommt nur im neuen Objekt vor, ein entfernter nur im ursprünglichen; ein geänderter enthält den vorherigen und den neuen Wert. Jeder Eintrag besitzt einen JSON-Pointer-Pfad mit führendem Schrägstrich. /profile/name bezeichnet etwa name innerhalb von profile. Ein Schrägstrich in einem Schlüsselnamen wird zu ~1, eine Tilde zu ~0. Dadurch bleiben auch ungewöhnliche Namen eindeutig. Die sortierte Verarbeitung erzeugt stabile Antworten. Der Block counts fasst Kategorien und Gesamtzahl zusammen. Sind alle drei Listen leer, sind die Objekte strukturell gleich, selbst wenn Einrückung oder Schlüsselreihenfolge im ursprünglichen Text abweichen.
Verschachtelte Objekte und Arrays behandeln
Enthält derselbe Schlüssel auf beiden Seiten ein Objekt, steigt der Vergleich bis zur tatsächlich abweichenden Eigenschaft hinab. Ändert sich nur profile.active, lautet der Pfad /profile/active. Ein vollständig neuer oder entfernter Schlüssel wird dagegen einmal mit seinem gesamten Wert gemeldet; seine Nachkommen werden nicht einzeln aufgeführt. Arrays gelten als geordnete JSON-Werte und werden vollständig verglichen. Einfügen, Löschen, Umordnen oder Bearbeiten eines Elements markiert daher die Array-Eigenschaft als geändert. Primitive Werte und null werden direkt verglichen; auch ein Typwechsel zählt als Änderung. Nur für die beiden Wurzelwerte gilt eine strengere Regel: before und after müssen JSON-Objekte ungleich null sein.
Unterschiede in Prüfungen und Automatisierung nutzen
Übergeben Sie das ursprüngliche Objekt als before und den Vorschlag als after. Das Browserwerkzeug läuft lokal; eine API-Anfrage kostet $0.002 und liefert dieselbe deterministische Struktur. Sie können eine Bereitstellung stoppen, wenn geschützte Einstellungen verschwinden, ausschließlich freigegebene Pfade zulassen oder kompakte Änderungen für Audits speichern. Weil Formatierung und Reihenfolge keine Fehlalarme erzeugen, eignet sich das Ergebnis für Konfigurationen, Webhooks, Flags, Berechtigungen und normalisierte Antworten. Behandeln Sie Pfade als JSON Pointer und beachten Sie ihre Kategorie. Bei Arrays erhalten Sie die vollständigen Werte und können anschließend fachliche Regeln anwenden. Eine ungültige Wurzel erzeugt einen klaren Eingabefehler statt eines irreführend leeren Ergebnisses.
Anwendungsfälle
Konfigurationsversionen prüfen
Vergleichen Sie aktive und geplante Konfigurationen ohne Rauschen durch Leerraum oder Reihenfolge.
Webhook-Entwicklung protokollieren
Erfassen Sie neue, entfernte oder geänderte verschachtelte Felder zwischen normalisierten Beispielen.
Freigegebene Einstellungen schützen
Prüfen Sie Pfade in CI und stoppen Sie Änderungen an geschützten Optionen.
Häufige Fragen
Welches Pfadformat verwendet das Ergebnis?
Jeder Pfad ist ein JSON Pointer nach RFC 6901; Schrägstriche in Schlüsseln werden ~1 und Tilden ~0.
Gilt eine andere Schlüsselreihenfolge als Änderung?
Nein. Objekte werden anhand ihrer Schlüssel und Werte verglichen, nicht anhand der Serialisierungsreihenfolge.
Wie werden Arrays verglichen?
Arrays sind geordnete Gesamtwerte. Jede Bearbeitung, Einfügung, Löschung oder Umordnung markiert das Array.
Kann ich zwei Arrays auf Wurzelebene vergleichen?
Nein. before und after müssen JSON-Objekte ungleich null sein; andere Wurzeln verursachen einen Eingabefehler.
Was kostet eine API-Anfrage?
Das Browserwerkzeug läuft lokal kostenlos. Jede API-Anfrage verwendet den veröffentlichten Grundpreis von $0.002.
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem Stack
curl -X POST https://api.kit.forhosting.com/data/diff-json-objects \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"before":{"name":"Ada","profile":{"active":true,"score":8},"roles":["reader"]},"after":{"name":"Ada","profile":{"active":false,"score":8,"city":"London"},"roles":["reader","editor"]}}'const res = await fetch("https://api.kit.forhosting.com/data/diff-json-objects", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"before": {
"name": "Ada",
"profile": {
"active": true,
"score": 8
},
"roles": [
"reader"
]
},
"after": {
"name": "Ada",
"profile": {
"active": false,
"score": 8,
"city": "London"
},
"roles": [
"reader",
"editor"
]
}
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/data/diff-json-objects",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"before": {
"name": "Ada",
"profile": {
"active": true,
"score": 8
},
"roles": [
"reader"
]
},
"after": {
"name": "Ada",
"profile": {
"active": false,
"score": 8,
"city": "London"
},
"roles": [
"reader",
"editor"
]
}
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/data/diff-json-objects", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"before":{"name":"Ada","profile":{"active":true,"score":8},"roles":["reader"]},"after":{"name":"Ada","profile":{"active":false,"score":8,"city":"London"},"roles":["reader","editor"]}}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"before":{"name":"Ada","profile":{"active":true,"score":8},"roles":["reader"]},"after":{"name":"Ada","profile":{"active":false,"score":8,"city":"London"},"roles":["reader","editor"]}}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/data/diff-json-objects", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Beispiel-Anfrage
{
"before": {
"name": "Ada",
"profile": {
"active": true,
"score": 8
},
"roles": [
"reader"
]
},
"after": {
"name": "Ada",
"profile": {
"active": false,
"score": 8,
"city": "London"
},
"roles": [
"reader",
"editor"
]
}
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.diff_json_objects",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Limits
max_mb | 25 |
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |