La spécification JSON ne définit formellement aucun ordre pour les clés d'un objet — {"a": 1, "b": 2} et {"b": 2, "a": 1} représentent les mêmes données. En pratique, pourtant, l'ordre des clés compte encore souvent, aussi bien pour les humains que pour les outils qui manipulent ces données.
Pourquoi trier les clés
- Diff. Si deux documents JSON avec des données identiques ont un ordre de clés différent, un diff textuel affichera une fausse différence. Le tri élimine ce problème.
- Sortie déterministe. Si le même objet est sérialisé plusieurs fois (par exemple pour générer un hash ou une clé de cache), des clés triées garantissent le même résultat à chaque fois.
- Lisibilité. Un objet trié par ordre alphabétique est plus facile à parcourir rapidement et à y trouver un champ précis, surtout dans de grandes structures.
Tri récursif
Pour que le résultat soit prévisible, le tri est généralement appliqué de façon récursive — pas seulement aux clés de premier niveau, mais aussi à celles de tous les objets imbriqués, à n'importe quelle profondeur. L'ordre des éléments dans les tableaux n'est pas modifié, car pour un tableau, l'ordre des éléments fait partie intégrante des données.
Quand ce n'est pas nécessaire
Si le JSON n'est consommé que par un programme (et non par une personne ou un outil de diff), trier les clés n'apporte généralement aucun avantage pratique — les analyseurs lisent un objet de la même façon quel que soit l'ordre des champs.
La règle française qui compare les accents à l'envers
Le tri alphabétique français ignore d'abord les accents pour classer deux mots selon leurs lettres de base, puis, si celles-ci sont identiques, les départage en comparant les accents en partant de la fin du mot plutôt que du début — c'est une règle de collation bien documentée (utilisée par ICU) propre au français. Ainsi "cote", "côte", "coté" et "côté" se classent selon l'accent du dernier caractère différent en partant de la droite, un comportement qu'un simple tri par code point Unicode ne reproduit absolument pas.
Tri et locale
Le tri alphabétique de clés qui ne contiennent pas que des caractères latins dépend de la méthode de comparaison : caractère par caractère selon le code Unicode (code point), ou selon des règles linguistiques (tri sensible à la locale). Par exemple, la comparaison par code point place les majuscules avant les minuscules quel que soit l'alphabet, tandis qu'un tri sensible à la locale peut ordonner les clés différemment.