Todos os artigos

JSON Sort Keys: por que ordenar as chaves de um objeto

A especificação JSON não define formalmente a ordem das chaves num objeto — {"a": 1, "b": 2} e {"b": 2, "a": 1} representam os mesmos dados. Na prática, porém, a ordem das chaves ainda costuma importar, tanto para pessoas quanto para ferramentas que trabalham com esses dados.

Por que ordenar as chaves

  • Comparação (diff). Se dois documentos JSON com dados idênticos têm ordens de chaves diferentes, um diff de texto vai mostrar uma diferença falsa. Ordenar elimina esse problema.
  • Saída determinística. Se o mesmo objeto é serializado várias vezes (por exemplo, para gerar um hash ou uma chave de cache), chaves ordenadas garantem o mesmo resultado toda vez.
  • Legibilidade. Um objeto ordenado alfabeticamente é mais fácil de percorrer rapidamente e encontrar um campo específico, especialmente em estruturas grandes.

Ordenação recursiva

Para que o resultado seja previsível, a ordenação costuma ser aplicada recursivamente — não só às chaves de nível superior, mas às chaves de todos os objetos aninhados em qualquer profundidade. A ordem dos elementos em arrays não muda, já que para arrays a ordem dos elementos é uma parte significativa dos dados.

Quando isso não é necessário

Se o JSON é consumido apenas por um programa (e não por uma pessoa ou uma ferramenta de diff), ordenar as chaves geralmente não traz nenhuma vantagem prática — parsers leem um objeto da mesma forma independentemente da ordem dos campos.

Por que uma ordenação ingênua separa "avó" de "avô"

Uma comparação bruta por ponto de código Unicode trata cada acento como um caractere totalmente diferente e mais "pesado" do que qualquer letra sem acento: como ô (U+00F4) tem um valor numérico bem maior que qualquer letra ASCII, uma chave como "avô" acaba ordenada depois de praticamente todas as chaves sem acento, mesmo as que viriam depois dela num dicionário. Numa ordenação de dicionário em português, o acento normalmente só desempata palavras que têm exatamente a mesma base — "avo" antes de "avó" antes de "avô" — e não desloca a palavra inteira para o fim da lista.

Ordenação e localidade (locale)

A ordenação alfabética de chaves que contêm caracteres além do alfabeto latino depende de os caracteres serem comparados byte a byte (ponto de código Unicode) ou levando em conta regras específicas do idioma (collation sensível à localidade). Por exemplo, a comparação por ponto de código coloca letras maiúsculas antes das minúsculas independentemente do alfabeto, enquanto a ordenação sensível à localidade pode ordenar as chaves de forma diferente.

Experimentar a ferramenta