Tutti gli articoli

JSON Sort Keys: perché ordinare le chiavi di un oggetto

La specifica JSON non definisce formalmente l'ordine delle chiavi in un oggetto — {"a": 1, "b": 2} e {"b": 2, "a": 1} rappresentano gli stessi dati. Nella pratica, però, l'ordine delle chiavi conta ancora spesso, sia per le persone sia per gli strumenti che lavorano con quei dati.

Perché ordinare le chiavi

  • Confronto (diff). Se due documenti JSON con dati identici hanno un ordine di chiavi diverso, un diff testuale mostrerà una differenza falsa. Ordinare elimina questo problema.
  • Output deterministico. Se lo stesso oggetto viene serializzato più volte (ad esempio per generare un hash o una chiave di cache), le chiavi ordinate garantiscono lo stesso risultato ogni volta.
  • Leggibilità. Un oggetto ordinato alfabeticamente è più facile da scorrere rapidamente e in cui trovare un campo specifico, soprattutto in strutture grandi.

Ordinamento ricorsivo

Perché il risultato sia prevedibile, l'ordinamento viene solitamente applicato in modo ricorsivo — non solo alle chiavi di primo livello, ma anche a quelle di tutti gli oggetti annidati a qualsiasi profondità. L'ordine degli elementi negli array non viene modificato, poiché per gli array l'ordine degli elementi è una parte significativa dei dati.

Quando non serve

Se il JSON viene consumato solo da un programma (non da una persona o da uno strumento di diff), ordinare le chiavi di solito non offre alcun vantaggio pratico — i parser leggono un oggetto allo stesso modo indipendentemente dall'ordine dei campi.

Perché l'italiano se la cava relativamente bene con l'ordinamento grezzo

L'italiano usa gli accenti solo sulle vocali finali per segnalare la sillaba tonica (città, perché, così) e non conosce lettere come la ñ spagnola o la ç portoghese: l'alfabeto tradizionale italiano, storicamente di sole 21 lettere (senza j, k, w, x, y, oggi comuni solo nei prestiti stranieri), ha un numero di casi limite molto più basso rispetto a francese, spagnolo o portoghese. Un ordinamento ingenuo per code point sposta comunque una chiave come "città" ben oltre le parole senza accento che dovrebbero seguirla nel dizionario, ma il problema si presenta con molta meno frequenza che in altre lingue romanze proprio perché le vocali accentate sono limitate a fine parola.

Ordinamento e locale

L'ordinamento alfabetico di chiavi che contengono caratteri non latini dipende dal fatto che il confronto avvenga byte per byte (per code point Unicode) oppure tenendo conto delle regole linguistiche (collation locale-aware). Ad esempio, il confronto per code point colloca le lettere maiuscole prima di quelle minuscole indipendentemente dall'alfabeto, mentre un ordinamento locale-aware può disporre le chiavi in modo diverso.

Prova lo strumento