Confronto di oggetti JSON: tutte le chiavi modificate
Un confronto testuale può rendere rumoroso un piccolo aggiornamento JSON, perché rientri, ordine delle chiavi e formattazione nascondono i dati realmente modificati.
Esegui gratis nel browser
Funziona nel tuo browser: gratis, senza registrazione, i file non escono dal tuo dispositivo.
Questo strumento confronta i valori analizzati, separa chiavi aggiunte, rimosse e cambiate, percorre gli oggetti annidati comuni e assegna un percorso JSON Pointer inequivocabile. Gli array mantengono l’ordine e vengono confrontati per intero. L’operazione è deterministica, non usa la rete e rifiuta array, primitive o null come valori di primo livello.
Come leggere una differenza JSON strutturale
Il risultato suddivide le differenze in raccolte di aggiunte, rimozioni e modifiche. Un’aggiunta esiste solo nell’oggetto aggiornato, una rimozione solo nell’originale e una modifica include i valori precedente e successivo. Ogni voce usa un percorso JSON Pointer che inizia con una barra: /profile/name indica name dentro profile. Una barra nel nome di una chiave diventa ~1 e una tilde diventa ~0, evitando ambiguità con i livelli annidati. Le proprietà vengono visitate in ordine per produrre risposte stabili. Il blocco counts riepiloga categorie e totale. Se tutte e tre le liste sono vuote, gli oggetti sono strutturalmente uguali anche quando il testo originale presenta rientri o ordine delle chiavi differenti.
Gestione di oggetti annidati e array
Quando la stessa chiave contiene un oggetto su entrambi i lati, il confronto scende fino alla proprietà precisa che differisce. Se cambia solo profile.active, il percorso restituito è /profile/active. Una chiave presente su un solo lato viene invece registrata una volta con il valore completo, senza espandere tutti i discendenti. Gli array sono valori JSON ordinati confrontati per intero: inserimento, eliminazione, riordino o modifica di un elemento segnala l’intera proprietà. Primitive e null vengono confrontati direttamente; anche un cambio di tipo è una modifica. Solo le due radici seguono una regola più rigida: before e after devono essere oggetti JSON non nulli.
Uso nelle revisioni e nelle automazioni
Inserisca l’oggetto originale in before e quello proposto in after. Lo strumento web opera localmente, mentre una richiesta API costa $0.002 e restituisce la stessa struttura deterministica. Può bloccare un rilascio se scompare un’impostazione protetta, verificare che cambino soltanto percorsi autorizzati o conservare una differenza compatta per gli audit. Poiché formattazione e ordine non producono falsi positivi, è adatto a configurazioni, webhook, flag, permessi e risposte normalizzate. Interpreti i percorsi come JSON Pointer e consideri anche la categoria. Per gli array riceverà i valori completi, sui quali potrà applicare regole specifiche. Una radice non valida restituisce un errore chiaro, non una differenza vuota ingannevole.
Casi d'uso
Revisionare una configurazione
Confronti la configurazione distribuita con quella candidata senza rumore di spazi o ordine delle chiavi.
Verificare l’evoluzione dei webhook
Registri i campi annidati comparsi, scomparsi o cambiati tra due esempi normalizzati.
Proteggere le impostazioni approvate
Controlli i percorsi in CI e fermi il rilascio quando cambia un’opzione protetta.
Domande frequenti
Quale formato usano i percorsi?
Ogni percorso è un JSON Pointer in stile RFC 6901: le barre nelle chiavi diventano ~1 e le tildi ~0.
L’ordine delle chiavi conta come modifica?
No. Il confronto considera chiavi e valori, quindi un altro ordine di serializzazione non genera differenze.
Come vengono confrontati gli array?
Sono valori ordinati confrontati per intero. Qualsiasi modifica, inserimento, rimozione o riordino li segnala.
Posso confrontare due array al livello principale?
No. before e after devono essere oggetti JSON non nulli; altre radici causano un errore di input.
Quanto costa una richiesta API?
Lo strumento web funziona gratis in locale. Ogni richiesta API usa il prezzo base pubblicato di $0.002.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo 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)Esempio di richiesta
{
"before": {
"name": "Ada",
"profile": {
"active": true,
"score": 8
},
"roles": [
"reader"
]
},
"after": {
"name": "Ada",
"profile": {
"active": false,
"score": 8,
"city": "London"
},
"roles": [
"reader",
"editor"
]
}
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "data.diff_json_objects",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
max_mb | 25 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |