Herramientas de desarrollo · JSON formateador y validador
Por qué un archivo de líneas JSON no supera la validación en la línea 2, columna 1
· Cómo funciona
json flujo de trabajo del desarrollador validación
Un archivo .jsonl consta de muchos JSON documentos, no de uno, por lo que un validador estricto se detiene exactamente donde comienza el segundo. Esta publicación explica las JSON Líneas y convenciones NDJSON y cómo validarlas un registro a la vez.
Válido en cada línea, no válido como archivo
Válido en cada línea, no válido como archivo: la exportación que todas las herramientas posteriores leen felizmente pero que un validador rechaza en la segunda línea. Un remitente de registros puede consumir cada nueva línea como límite de registro, pero un analizador JSON estricto ve el archivo completo como una entrada. El primer objeto está completo JSON; la siguiente llave de apertura es un segundo valor de raíz ilegal.
ToolAcre valida un texto JSON, no JSON líneas. Una vez que el escáner completa el primer valor raíz, cualquier carácter posterior que no sea un espacio en blanco se informa como inesperado después del final del valor JSON. No ofrece validación o conversión NDJSON por línea como alternativa oculta. Esa distinción evita que un resultado verde implique que se verificaron todos los registros en una secuencia orientada a líneas.
Un texto, un valor: lo que RFC 8259 define como un texto JSON y por qué dos valores de nivel superior seguidos son un error gramatical
Un texto, un valor: lo que RFC 8259 define como un texto JSON y por qué dos valores de nivel superior seguidos son un error gramatical. Un texto JSON es un valor serializado, por lo que un objeto, matriz, cadena, número, booleano o nulo puede estar en la raíz. Los espacios en blanco pueden rodear ese valor, pero no pueden separar varias raíces en un documento válido más grande.
Por ejemplo, `{"ok":true} {"ok":false}` contiene dos objetos válidos individualmente pero no es un texto JSON. El análisis del primer objeto consume un valor completo; Al analizar la cadena completa se debe rechazar el segundo `{`. Para representar ambos valores en JSON ordinario, colóquelos dentro de una matriz y agregue la coma requerida entre los elementos de la matriz.
JSON Líneas y NDJSON
JSON Líneas y NDJSON: las convenciones delimitadas por nueva línea, por qué existen para transmisión y registros, y en qué se diferencian de una matriz JSON. Cada línea física lleva un valor JSON completo, normalmente un objeto, y la nueva línea actúa como marco fuera de la gramática JSON. Los productores pueden agregar registros y los consumidores pueden procesarlos de forma incremental sin cargar una colección completa.
En cambio, una matriz tiene un corchete de apertura, elementos separados por comas y un corchete de cierre, lo que hace que todo el archivo tenga un único valor JSON. Es conveniente para las API que devuelven una colección limitada, pero incómodo para un flujo de eventos en crecimiento indefinido. Un archivo de líneas JSON truncado puede conservar todos los registros anteriores completos; una matriz truncada comúnmente deja el valor adjunto sin terminar.
Por qué el error siempre está en la línea 2, columna 1
Por qué el error siempre está en la línea 2, columna 1: el analizador finaliza el primer valor, espera el final de la entrada y encuentra el primer carácter del segundo registro. La nueva línea en sí es un espacio en blanco final legal, por lo que no provoca el error. La llave de apertura del siguiente registro es el primer token que contradice el estado del documento completado.
Esa ubicación es una evidencia de diagnóstico en lugar de una afirmación de que el segundo objeto tiene un formato incorrecto. Si el informe apunta constantemente al primer carácter que no es un espacio en blanco después de una raíz válida, inspeccione la forma del archivo antes de editar la puntuación. Eliminar la llave dañaría el registro; elegir un lector con reconocimiento de línea o convertir los registros en una matriz soluciona la falta de coincidencia de encuadre real.
Ejemplo resuelto: validar tres registros
Ejemplo resuelto: validar tres registros: verificar cada línea por sí sola en lugar de envolverlas en una matriz con comas. Supongamos que las líneas contienen `{"level":"info"}`, `{"level":"warn"}` y `{"level":"error"}`. Un validador orientado a líneas analiza tres entradas separadas y puede identificar el registro exacto si a uno le falta una comilla o una coma al final.
Para una verificación estricta de todo el documento, transforme la muestra a `[{"level":"info"},{"level":"warn"},{"level":"error"}]`. Los corchetes establecen una raíz y las comas delimitan sus elementos. No se limite a reemplazar las nuevas líneas con comas: eso produce tres raíces separadas por puntuación a menos que se agregue la matriz circundante, y puede manejar mal las líneas en blanco que la convención fuente puede prohibir o ignorar.
Conversión entre las dos formas
Conversión entre las dos formas: cuándo una matriz envolvente es apropiada y cuándo anularía el punto de salida delimitado por líneas. Una exportación finita destinada a una solicitud de API, un editor o un validador estricto a menudo puede convertirse en una matriz. La conversión debe analizar primero cada registro, porque la concatenación textual no puede dar cuenta de forma segura de caracteres de escape incrustados o líneas no válidas.
Mantenga JSON líneas cuando los registros lleguen continuamente, se agreguen archivos o los consumidores necesiten memoria limitada y recuperación a nivel de registros. Convertir un flujo de eventos de varios gigabytes en una matriz requiere conservar el estado del contenedor y retrasa un análisis completo hasta que llega el corchete de cierre. En la otra dirección, serialice cada elemento de la matriz de forma compacta en una línea y defina si se permiten líneas vacías o nuevas líneas finales.
Lo que esto no cubre
Lo que esto no cubre: JSON concatenado sin nuevas líneas y marcos de separador de registros (RFC 7464), que necesitan analizadores dedicados. Los valores colocados directamente juntos no se pueden dividir de forma segura con una simple operación de línea, especialmente cuando las raíces pueden ser números o cadenas. RFC 7464 utiliza un carácter separador de registros ASCII para encuadrar secuencias de texto JSON en lugar de depender únicamente de nuevas líneas visibles.
Tampoco valida reglas de aplicación compartidas por registros. Analizar cada línea no puede demostrar que las marcas de tiempo estén ordenadas, que los identificadores sean únicos o que todos los objetos utilicen el mismo esquema. Esas comprobaciones pertenecen después del encuadre de registros y el análisis de sintaxis. Del mismo modo, una nueva línea incrustada como secuencia de escape ` ` dentro de una cadena hay datos, no un límite físico, y un lector de línea compatible debe preservar esa distinción.
Conclusión: sepa qué forma está sosteniendo
Conclusión: sepa qué forma está sosteniendo y cómo la posición del validador le indica instantáneamente que un archivo está delimitado por líneas. Un error en el primer token de la línea dos después de un valor completo de la línea uno indica claramente que hay múltiples registros enmarcados, no una sintaxis rota en el primer registro. Verifique la extensión, la documentación del productor y el consumidor esperado antes de cambiar los datos.
Utilice un analizador JSON Líneas o NDJSON para validar registros de forma independiente cuando la nueva línea sea intencional. Utilice una matriz cuando el destino requiera una colección JSON completa. ToolAcre rechaza correctamente el archivo multiraíz porque su contrato es una validación estricta de texto único; el rechazo protege ese contrato en lugar de mostrar que JSON delimitado por nuevas líneas es inherentemente defectuoso. Haga coincidir el validador con el formato de encuadre.