- Un conjunto de utilidades de formateo que ordena los datos JSON para que sean fáciles de leer sin dejar de mantener una forma compacta
- Expresa arreglos y objetos en una sola línea siempre que sea posible y, cuando la estructura es similar, los alinea en formato de tabla
- Compatible con preservación de comentarios, manteniendo comentarios que no existen en el estándar JSON pero que son comunes en entornos reales
- Se puede usar en distintos entornos como biblioteca de .NET, paquete de JavaScript/TypeScript, extensión de VS Code y formateador para navegador
- Una herramienta que mejora la comprensión visual para desarrolladores y analistas de datos, superando las limitaciones de legibilidad de los formateadores JSON existentes
Resumen de FracturedJson
- FracturedJson es un conjunto de utilidades que genera un formato JSON compacto pero fácil de leer para personas
- Los arreglos y objetos se muestran en una sola línea si no son demasiado largos ni complejos
- Varias líneas con estructura similar se alinean por campos y se muestran en forma de tabla
- Los arreglos largos se muestran en varias líneas, colocando varios elementos por línea
- El formato de salida puede controlarse con varias opciones y, en la mayoría de los casos, la configuración predeterminada ya produce resultados agradables de ver
- Se ofrece como página de formateo basada en navegador, biblioteca de .NET, paquete de JavaScript/TypeScript y extensión de VS Code
- También se indica por separado una opción para Python
Motivation
- La mayoría de las bibliotecas JSON solo ofrecen dos formatos
- Minified JSON: eficiente, pero difícil de leer para personas
- Beautified/Indented JSON: demasiado expandido, lo que dificulta una comprensión rápida
- FracturedJson formatea los datos como si una persona los hubiera escrito directamente
- Mantiene los contenedores en una sola línea salvo cuando son demasiado complejos o largos
- Los arreglos u objetos similares se alinean en formato de tabla
Cómo funciona (How It Works)
- FracturedJson usa cuatro tipos de formateo
- Inlined: representa en una sola línea objetos o arreglos cortos y simples
- La opción
MaxInlineComplexity controla el nivel de anidación permitido
- Compact Multiline Array: coloca varios elementos por línea, pero los muestra distribuidos en varias líneas
MaxCompactArrayComplexity ajusta la complejidad permitida de anidación y puede desactivarse con -1
- Table: alinea elementos con estructura similar en formato de columnas
- Si los contenedores internos son demasiado complejos, solo una parte se reduce
- Puede controlarse con
MaxTableRowComplexity y TableCommaPlacement
- Expanded: si no se cumple ninguna de las condiciones anteriores, muestra cada elemento en varias líneas con sangría
Manejo de comentarios
- Aunque el estándar JSON no permite comentarios, FracturedJson es compatible con preservación de comentarios
- Los comentarios se mantienen junto con los elementos relacionados, y se admiten tanto comentarios multilínea como comentarios en línea
Discussions
- Ofrece un espacio de GitHub Discussions para preguntas de usuarios, comentarios y sugerencias
- Permite debatir sobre el proyecto y proponer mejoras
1 comentarios
Comentarios en Hacker News
Actualmente este proyecto tiene dos implementaciones mantenidas.
Una es la versión en C# (FracturedJson .NET Library) y la otra es la versión en TypeScript/JavaScript (FracturedJsonJs).
Antes también había una versión pura en Python, pero ya no se mantiene y fue reemplazada por un wrapper de Python que envuelve el código en C# (fractured-json).
Se indica que esta versión de Python requiere el runtime de .NET, así que la desventaja es que no se instala fácilmente solo con pip install.
Creo que esta situación es una buena oportunidad para crear una conformance suite independiente del lenguaje: un conjunto de pruebas basado en datos que permita verificar si varias implementaciones se comportan igual.
Como referencia, la antigua versión en Python ya usaba pruebas de este tipo (datos de prueba de compact-json).
Tal vez valdría la pena añadirlo al comentario original.
Más detalles en fracturedjson-rs GitHub y en el paquete de crates.io.
El comentario relacionado con la explicación está aquí.
html5lib-tests o xss-bench, que yo hice, son ejemplos de eso.
Hice una versión portada a Rust, y con la herramienta CLI se puede formatear JSON con este formato.
Se puede instalar desde fracturedjson-rs y el paquete de crates.io (
cargo install fracturedjson).Ofrece varias opciones y permite un control detallado de cosas como el estilo de comentarios, el estilo de indentación y el límite de ancho de línea.
Este proyecto está realmente genial.
Me gusta la idea de hacer que JSON sea más legible para humanos.
Yo estoy desarrollando bonjson, que va en la dirección opuesta y hace que JSON sea más amigable para máquinas.
Tiene exactamente las mismas capacidades y restricciones que JSON, y puede leerse y escribirse 35 veces más rápido.
No agrega tipos ni funciones nuevas; simplemente hace exactamente lo que JSON puede hacer.
Por ejemplo, no especifica el ancho en bits de los números ni distingue explícitamente entre enteros y punto flotante.
Si existiera ese modelo, sería posible un mapeo 1:1 entre representaciones.
Estoy escribiendo este texto sobre ese tema.
Por ejemplo, una cadena como
"a\u0000b"es JSON válido; si no puede serializarse, entonces esa afirmación no se sostiene del todo.Yo una vez hice un serializador que guardaba/cargaba JSON y archivos binarios mediante una interfaz común.
En mi experiencia, JSON era un formato con muchas limitaciones y pocas ventajas.
Por eso lo cambié por un formato más flexible donde se pueden omitir comas, dos puntos y comillas, y que permite cadenas multilínea y comentarios.
Ojalá ya dejemos de fingir que JSON siempre es un formato “fácil de leer para humanos”.
Hace falta una alternativa estándar para entornos no centrados en JSON.
Qué sorpresa.
Yo también implementé algo parecido en Python en unas 200 líneas, pero no sabía que ya existía una librería así.
Me pregunto si hay una opción para recibir entrada por pipe como jq.
La versión en JavaScript y el wrapper de Python también ofrecen la misma herramienta CLI.
Con
rcl epuedes ver el formato RCL y conrcl jela salida JSON.No tiene alineación en tablas como FracturedJson, pero se basa en el algoritmo A Prettier Printer de Philip Wadler, así que hace saltos de línea automáticos según el ancho disponible.
<()para crear un archivo temporal y procesarlo.-como nombre del archivo de entrada, puede leer desde stdin.Hice un formateador JSON llamado Virtuous, y esto me impresionó tanto que hasta me dieron ganas de abandonar mi propio formateador.
De verdad es un trabajo excelente.
Yo hice un script de Groovy llamado “mommyjson”.
En lugar de conservar el formato JSON, muestra en una sola línea la relación de parentesco de cada elemento (índice de arreglo, nombre de objeto, etc.) para que sea intuitivo ubicar los datos.
Ver código
Como Groovy no es popular, estaría bien que existiera un port a Python.
Algunos ejemplos son gron y jstream, que hice yo.
Tal vez sería más fácil de entender si añadieras una salida de ejemplo de uso.
Me pregunto si JSON de verdad es un formato que necesite mejoras para hacerlo más legible para humanos.
Hay muchas mejores formas de mostrar datos al usuario, y creo que JSON está más bien para transferir datos entre sistemas.
Son útiles en situaciones de depuración donde necesitas entender rápidamente datos complejos y anidados.
Eso pasa muy seguido, sobre todo cuando trabajas en código de integración con sistemas externos.
python -m json.toolpara leer datos JSON.Si una herramienta como esta logra mostrarlos mejor, ya tiene suficiente valor.
Al final, la ventaja de JSON es que pueden leerlo tanto humanos como máquinas, así que para depuración sigue teniendo sentido.
Me gusta mucho esta idea.
La razón principal por la que su adopción va lenta ahora mismo es la falta de soporte en la mayoría de los lenguajes y en gestores de paquetes (como homebrew).
Si la librería de .NET se compilara como una biblioteca compartida compatible con C, podría usarse fácilmente desde muchos lenguajes.
Es un enfoque interesante.
Ojalá los formateadores de código también funcionaran así.
Los formateadores actuales son demasiado rígidos, y eso hace difícil entender la estructura.
Los comentarios se alinean a la derecha para que queden ordenados.
Gracias a esa estructura, incluso bloques switch-case o tablas de macros pueden alinearse fácilmente en 2D.
La capa base la programé en una hora, y ahora estoy diseñando la detección automática de bloques combinando LSP y observación del código.
En un mundo ideal habría abandonado XML, pero por restricciones heredadas no había opción.