Trieur de clés JSON

Triez récursivement toutes les clés d'objets JSON par ordre alphabétique. L'ordre des tableaux est préservé.

Tri :
Indentation :
Exemples :
JSON en entrée0 caractères
Sortie triée

Cet outil a-t-il résolu votre problème ?

Exemples de code

JavaScript

// Recursive JSON key sort
function sortKeys(value, order = 'asc') {
  if (Array.isArray(value))
    return value.map(v => sortKeys(v, order));
  if (value !== null && typeof value === 'object') {
    const keys = Object.keys(value).sort(
      order === 'asc'
        ? (a, b) => a.localeCompare(b)
        : (a, b) => b.localeCompare(a)
    );
    return Object.fromEntries(
      keys.map(k => [k, sortKeys(value[k], order)])
    );
  }
  return value;
}

const sorted = JSON.stringify(
  sortKeys({ z: 3, a: 1, m: 2 }),
  null, 2
);
// { "a": 1, "m": 2, "z": 3 }

Python

import json

data = {"z": 3, "a": 1, "m": 2, "nested": {"y": 9, "b": 2}}

# Built-in sort_keys option
sorted_json = json.dumps(data, sort_keys=True, indent=2)
print(sorted_json)
# {
#   "a": 1,
#   "m": 2,
#   "nested": { "b": 2, "y": 9 },
#   "z": 3
# }

# Reverse / descending sort
def sort_keys_desc(obj):
    if isinstance(obj, dict):
        return {k: sort_keys_desc(obj[k])
                for k in sorted(obj, reverse=True)}
    if isinstance(obj, list):
        return [sort_keys_desc(v) for v in obj]
    return obj

jq (CLI)

# Sort all keys recursively (ascending)
jq 'walk(if type == "object"
  then to_entries | sort_by(.key) | from_entries
  else . end)' input.json

# One-liner for simple objects
echo '{"z":3,"a":1}' | jq -S .
# -S flag sorts keys alphabetically

# Sort and save to file
jq -S . input.json > sorted.json

Go

package main

import (
    "encoding/json"
    "sort"
)

// JSON marshaling in Go preserves map key
// order alphabetically by default.

func SortKeys(v interface{}) interface{} {
    switch val := v.(type) {
    case map[string]interface{}:
        keys := make([]string, 0, len(val))
        for k := range val { keys = append(keys, k) }
        sort.Strings(keys)
        result := make(map[string]interface{})
        for _, k := range keys {
            result[k] = SortKeys(val[k])
        }
        return result
    case []interface{}:
        for i, item := range val {
            val[i] = SortKeys(item)
        }
    }
    return v
}

// json.Marshal on map[string]interface{}
// already sorts keys alphabetically.
b, _ := json.MarshalIndent(data, "", "  ")

Questions fréquentes

Pourquoi voudrait-on trier les clés JSON ?

Le tri des clés facilite la comparaison JSON avec les outils diff. Lorsque deux objets JSON ont les mêmes données mais un ordre de clés différent, un diff affiche de faux changements. Cela aide aussi à la sérialisation canonique, la standardisation des fichiers de configuration et la navigation visuelle des grands objets JSON.

Les objets imbriqués sont-ils aussi triés récursivement ?

Oui. Le trieur traite récursivement tous les objets imbriqués à n'importe quelle profondeur. Les tableaux conservent leur ordre d'origine — seules les clés des objets sont triées.

Que se passe-t-il avec les tableaux dans le JSON ?

Les éléments des tableaux conservent leur ordre d'origine car les tableaux sont ordonnés par définition. Si un tableau contient des objets, les clés de chaque objet sont triées, mais l'ordre du tableau lui-même reste inchangé.

Y a-t-il une limite de taille pour l'entrée JSON ?

Il n'y a pas de limite explicite, mais les très gros fichiers JSON (plusieurs Mo) peuvent être lents à traiter dans le navigateur. Pour les gros fichiers, nous recommandons des outils en ligne de commande comme jq.

Comment trier les clés JSON depuis la ligne de commande ?

Utilisez jq avec le filtre to_entries | sort_by(.key) | from_entries, ou json.dumps de Python avec sort_keys=True. Voir les exemples de code ci-dessous.

Le tri des clés modifie-t-il la signification de mon JSON ?

Non. Les objets JSON sont définis comme des collections non ordonnées de paires clé-valeur, donc l'ordre des clés n'a aucune signification sémantique. Tout parseur JSON produira des résultats identiques quel que soit l'ordre des clés.