Ir para o conteúdo
jsonbeautifiers
Português

Ordenar JSON

Ordena as chaves em ordem alfabética em todos os objetos aninhados, para diffs que continuam limpos.

Filtrar com JSONPath

Sintaxe da RFC 9535. O resultado substitui o painel a partir do qual você abriu esta janela.

 

Nada do que você cola sai do seu navegador. A lista de permissões connect-src transforma isso em uma garantia do navegador, e não em uma promessa. Confira você mesmo

Ordena as chaves dos objetos em ordem alfabética, recursivamente por todo objeto aninhado. A ordem dos arrays nunca é tocada, porque a ordem de um array significa algo e a das chaves de um objeto não.

O motivo para fazer isso são os diffs. Dois arquivos com o mesmo conteúdo em ordem de chaves diferente geram um diff cheio de ruído. Ordene os dois e o diff mostra só o que realmente mudou.

Quando ordenar é a jogada certa

Antes de commitar um arquivo gerado
Lock files, configuração exportada e qualquer coisa que uma ferramenta escreva. Se o gerador não garante uma ordem, ordenar deixa o arquivo estável entre execuções e entre máquinas.
Antes de comparar dois documentos
Ordenar os dois primeiro transforma um diff de texto em algo legível. O nosso diff estrutural ignora a ordem das chaves de qualquer forma, então isto serve sobretudo para ferramentas que não ignoram.
Para obter uma forma canônica
Fazer hash ou assinar um documento exige uma serialização determinística. Ordenar as chaves é uma parte; a RFC 8785, o JSON Canonicalization Scheme, especifica o resto, incluindo formatação de números e escape de strings.

Quando ordenar é a jogada errada

Um arquivo de configuração mantido à mão em que a ordem carrega significado para quem lê: as opções importantes no topo, as relacionadas agrupadas. Ordenar isso alfabeticamente é tecnicamente inofensivo e praticamente irritante.

Qualquer coisa em que um consumidor dependa da ordem das chaves. Ninguém deveria depender, mas alguns parsers caseiros dependem, e descobrir isso em produção sai caro.

Como a comparação funciona

Diferencia maiúsculas de minúsculas por padrão, o que coloca as maiúsculas antes das minúsculas porque essa é a ordem dos pontos de código. Ligue a comparação sem diferenciar caixa para obter a ordem que as pessoas costumam esperar de uma lista de nomes.

Note que esta é uma ordenação por ponto de código, não sensível a localidade. Ela é determinística em qualquer lugar, que é o que uma forma canônica precisa; uma ordenação sensível a localidade produziria arquivos diferentes em máquinas diferentes.

How to do this in code

Ordenando chaves em código.

sh jq

O -S vale em todos os níveis, não só no de cima.

jq -S . input.json          # sort keys, recursively
jq -S -c . input.json       # sorted and compact
py Python
import json

# sort_keys applies recursively
out = json.dumps(json.loads(text), sort_keys=True, indent=2)
js JavaScript

Não existe um stringify ordenado embutido no JavaScript, e é por isso que este trecho circula tanto.

// The replacer only receives keys, so sorting needs a walk.
function sortDeep(value) {
  if (Array.isArray(value)) return value.map(sortDeep);
  if (value && typeof value === 'object') {
    return Object.fromEntries(
      Object.keys(value).sort().map((k) => [k, sortDeep(value[k])]),
    );
  }
  return value;
}

const out = JSON.stringify(sortDeep(JSON.parse(text)), null, 2);
go Go

Este é um dos raros casos em que a biblioteca padrão faz a coisa certa sem que você peça.

// encoding/json sorts map keys automatically when marshalling
// a map. Struct fields keep their declaration order.
var v map[string]any
json.Unmarshal(data, &v)
out, _ := json.MarshalIndent(v, "", "  ")   // keys sorted

Perguntas frequentes

Ordenar altera os meus dados?
Semanticamente não. Objetos JSON não têm ordem segundo a especificação, então um documento ordenado carrega o mesmo valor. Ele altera os bytes, que é justamente o objetivo.
Por que os elementos dos arrays não são ordenados?
Porque a ordem de um array faz parte dos dados. Transformar [3,1,2] em [1,2,3] seria alterar o documento, não reformatá-lo.
Isto é o mesmo que JSON canônico?
É uma parte disso. A RFC 8785, o JSON Canonicalization Scheme, também especifica formatação de números, escape de strings e normalização Unicode, tudo isso importante se você for fazer hash ou assinar o resultado.