- Conjunto de utilitários de formatação que organiza dados JSON para facilitar a leitura humana enquanto mantém um formato compacto
- Representa arrays e objetos em uma única linha sempre que possível e, quando a estrutura é semelhante, alinha em formato de tabela
- Suporta preservação de comentários, mantendo junto comentários comuns em ambientes reais de uso, embora não façam parte do padrão JSON
- Pode ser usado em vários ambientes, como biblioteca .NET, pacote JavaScript/TypeScript, extensão para VS Code e formatador no navegador
- Uma ferramenta que melhora as limitações de legibilidade dos formatadores JSON existentes e aumenta a compreensão visual para desenvolvedores e analistas de dados
Visão geral do FracturedJson
- FracturedJson é um conjunto de utilitários que gera um formato JSON compacto e, ao mesmo tempo, fácil de ler por humanos
- Arrays e objetos são exibidos em uma única linha quando não são longos nem complexos demais
- Várias linhas com estrutura semelhante são alinhadas por campo em formato de tabela
- Arrays longos são distribuídos em várias linhas, com vários itens por linha
- É possível controlar o formato de saída com várias configurações, e na maioria dos casos as definições padrão já produzem um resultado agradável de ler
- Disponível como página de formatação no navegador, biblioteca .NET, pacote JavaScript/TypeScript e extensão para VS Code
- Também há orientação separada para uma opção em Python
Motivação
- A maioria das bibliotecas JSON oferece apenas dois formatos
- Minified JSON: eficiente, mas difícil para humanos lerem
- Beautified/Indented JSON: espalhado demais na tela, o que dificulta uma leitura rápida
- O FracturedJson formata os dados como se tivessem sido escritos manualmente por uma pessoa
- Mantém os contêineres em uma única linha quando não são complexos ou longos demais
- Arrays ou objetos semelhantes são alinhados em formato de tabela
Como funciona (How It Works)
- O FracturedJson usa quatro tipos de formatação
- Inlined: representa objetos ou arrays curtos e simples em uma única linha
- A configuração
MaxInlineComplexity controla o nível de aninhamento permitido
- Compact Multiline Array: coloca vários itens por linha, mas distribuídos em múltiplas linhas
MaxCompactArrayComplexity ajusta o nível de aninhamento permitido, e -1 pode desativar esse modo
- Table: alinha itens com estrutura semelhante em colunas
- Se os contêineres internos forem complexos demais, apenas parte deles será reduzida
- Pode ser controlado com
MaxTableRowComplexity e TableCommaPlacement
- Expanded: quando nenhuma das condições acima se aplica, exibe cada item em múltiplas linhas com indentação
Tratamento de comentários
- O padrão JSON não permite comentários, mas o FracturedJson oferece preservação de comentários
- Os comentários são mantidos junto dos elementos relacionados, e tanto comentários de múltiplas linhas quanto comentários inline podem ser processados
Discussions
- Há um espaço no GitHub Discussions para perguntas de usuários, feedback e sugestões
- É possível discutir o projeto e propor melhorias
1 comentários
Comentários do Hacker News
Atualmente, este projeto tem duas implementações mantidas
uma é a versão em C# (FracturedJson .NET Library) e a outra é a versão em TypeScript/JavaScript (FracturedJsonJs)
antigamente também havia uma versão pura em Python, mas ela não é mais mantida e foi substituída por um wrapper em Python para o código em C# (fractured-json)
essa versão em Python informa que exige o runtime do .NET, então a desvantagem é que ela não é fácil de instalar apenas com pip install
acho que isso é uma boa oportunidade para criar uma conformance suite independente de linguagem — ou seja, um conjunto de testes orientados a dados capaz de verificar se várias implementações se comportam da mesma forma
por sinal, a antiga versão em Python já usava testes nesse formato (dados de teste do compact-json)
talvez valha a pena adicionar isso ao comentário original
mais detalhes em fracturedjson-rs GitHub e no pacote no crates.io
há um comentário explicando isso aqui
html5lib-tests e também o xss-bench que eu fiz são exemplos disso
Fiz uma versão portada para Rust, e com a ferramenta de CLI dá para formatar JSON nesse estilo
pode ser instalado via fracturedjson-rs e pacote no crates.io (
cargo install fracturedjson)oferece várias opções e permite controle fino sobre forma de comentar, estilo de indentação e limite de largura de linha, entre outros
Este projeto é realmente muito legal
gosto da proposta de tornar o JSON mais fácil para humanos lerem
eu estou fazendo o oposto com o bonjson, deixando o JSON mais amigável para máquinas
ele tem exatamente os mesmos recursos e limitações do JSON, mas consegue ler e gravar 35 vezes mais rápido
não há novos tipos nem recursos, ele apenas faz exatamente o que o JSON consegue fazer
por exemplo, ele não especifica largura em bits para números nem distingue inteiro de ponto flutuante
com esse modelo, seria possível ter um mapeamento 1:1 entre representações
estou escrevendo este texto sobre esse tema
por exemplo, uma string como
"a\u0000b"é um JSON válido, e se isso não puder ser serializado, então essa afirmação não se sustenta por completoeu já fiz um serializer que salva/carrega JSON e arquivos binários por meio de uma interface comum
na minha experiência, JSON era um formato com muitas limitações e poucas vantagens
então eu o substituí por um formato mais flexível, em que vírgulas, dois-pontos e aspas podem ser omitidos, e strings multilinha e comentários são permitidos
já passou da hora de parar de fingir que JSON é sempre um formato “bom para humanos lerem”
precisamos de uma alternativa padrão para ambientes que não são centrados em JSON
Surpreendente
eu também implementei algo parecido em Python com cerca de 200 linhas, mas não sabia que já existia uma biblioteca assim
Fico pensando se existe uma opção para receber entrada por pipe, como no jq
a versão em JavaScript e o wrapper em Python também oferecem a mesma ferramenta de CLI
com
rcl evocê vê no formato RCL, e comrcl jevê a saída em JSONele não faz alinhamento em tabela como o FracturedJson, mas usa o algoritmo A Prettier Printer, de Philip Wadler, para quebrar linhas automaticamente de acordo com a largura
<()-como nome do arquivo de entrada, ele vai ler do stdinEu criei um formatador de JSON chamado Virtuous, e isso foi tão impressionante que quase me deu vontade de abandonar o meu formatador
é um trabalho realmente excelente
Eu fiz um script em Groovy chamado “mommyjson”
em vez de preservar a formatação do JSON, ele mostra em uma linha a relação com os elementos pais (índice no array, nome do objeto etc.), para que seja mais intuitivo localizar os dados
Ver código
como Groovy não é popular, seria bom se surgisse um port para Python
alguns exemplos são o gron e o jstream, que eu fiz
talvez fique mais fácil de entender se você adicionar uma saída de exemplo de uso
Tenho dúvidas se JSON realmente é um formato que precisa ser melhorado para leitura humana
há maneiras muito melhores de mostrar dados ao usuário, e acho que JSON deve ser usado para transmissão de dados entre sistemas
é útil em situações de depuração em que você precisa entender rapidamente dados complexos e aninhados
isso acontece com frequência principalmente ao trabalhar em código de integração com sistemas externos
python -m json.toolpara ler dados em JSONse uma ferramenta como essa mostrar melhor do que eles, já tem bastante valor
no fim, a principal vantagem do JSON é ser legível tanto para humanos quanto para máquinas, então ele ainda faz sentido para depuração
Gostei muito desta ideia
o motivo de a adoção ser lenta hoje é principalmente a falta de suporte na maioria das linguagens e em gerenciadores de pacotes (como o homebrew)
se a biblioteca .NET fosse compilada como uma biblioteca compartilhada compatível com C, seria fácil usá-la em várias linguagens
É uma abordagem interessante
seria bom se formatadores de código também funcionassem assim
os formatadores atuais são rígidos demais e dificultam entender a estrutura
os comentários são alinhados à direita para ficarem organizados
graças a essa estrutura, também é fácil alinhar em 2D blocos switch-case e tabelas de macros
codifiquei a camada básica em uma hora e agora estou projetando a detecção automática de blocos combinando LSP com observação de código
o ideal teria sido abandonar o XML, mas por restrições de legado não havia como evitar isso