Español

Herramientas de desarrollo · JSON formateador y validador

Caracteres invisibles que rompen JSON: lista de materiales, comillas tipográficas y NBSP

· Cómo funciona

json flujo de trabajo del desarrollador validación

Caracteres invisibles que rompen JSON: BOM, comillas tipográficas y NBSP ilustrados con tokens JSON y un límite de validación preciso
Ilustración de vector original de ToolAcre

Cuando el validador informa un error en el primer carácter y el archivo parece perfecto, la culpa suele ser un carácter invisible. Esta publicación explica las marcas de orden de bytes, las comillas tipográficas y los espacios sin separación, y cómo se informa cada uno de ellos.

Línea 1, columna 1, no hay nada malo que ver

Línea 1, columna 1, no hay nada malo que ver: un documento JSON puede comenzar con un carácter que ocupa una posición real pero se representa sin glifo visible. La llave de apertura parece ser la primera aunque la preceda una marca de orden de bytes o un carácter de ancho cero. Un analizador estricto encuentra ese punto de código oculto antes de llegar a `{`, por lo que informar la primera columna es más preciso que vago. La visualización y la secuencia de personajes simplemente cuentan historias diferentes.

No elimine una llave que parezca correcta simplemente porque aparece el símbolo de intercalación a su lado. Inspeccione el punto de código en el desplazamiento informado, habilite espacios en blanco visibles o cambie a una vista hexadecimal. ToolAcre no elimina silenciosamente una lista de materiales inicial antes del análisis y su escáner informa el primer carácter inesperado.

La marca de orden de bytes UTF-8

La marca de orden de bytes UTF-8: la secuencia de bytes EF BB BF se decodifica a U+FEFF al comienzo de un archivo. El orden de los bytes no es ambiguo en UTF-8, por lo que la marca no es necesaria, pero algunos editores y herramientas de exportación aún la agregan como firma de codificación. RFC 8259 dice que los generadores JSON no deben agregar una lista de materiales a JSON en red, aunque los analizadores pueden optar por ignorar una para lograr interoperabilidad. Esa tolerancia no se puede asumir entre herramientas.

En una cadena de JavaScript, la lista de materiales es un carácter aunque su representación UTF-8 utiliza tres bytes. ToolAcre informa las posiciones en caracteres de cadena, por lo que aparece una marca inicial en la línea 1, columna 1. Configure el editor para guardar UTF-8 sin BOM o elimine U+FEFF antes de distribuir el archivo.

Citas ingeniosas de procesadores de texto

Comillas tipográficas de procesadores de texto: las marcas tipográficas de apertura y cierre se ven pulidas en prosa, pero JSON reconoce solo las comillas ASCII U+0022 como delimitador de cadena. U+201C y U+201D son caracteres Unicode normales. Fuera de una cadena, no pueden comenzar con un nombre o valor de propiedad, por lo que el validador informa las comillas tipográficas. La corrección automática en el chat, el correo electrónico o un editor de documentos a menudo introduce el cambio después de que JSON fuera válido originalmente.

Reemplace los delimitadores con comillas dobles rectas y luego examine los apóstrofes y comillas que pertenecen al valor. Las comillas son perfectamente legales como contenido dentro de una cadena JSON correctamente delimitada, como `"She said “go”"`; sólo fallan cuando se les pide que realicen el trabajo gramatical del delimitador.

Espacios que no se separan y caracteres de ancho cero

Espacios que no se separan y caracteres de ancho cero: JSON el espacio en blanco es una lista deliberadamente corta: espacio ordinario U+0020, tabulación U+0009, avance de línea U+000A y retorno de carro U+000D. Un espacio sin separación U+00A0 puede parecer idéntico a un espacio normal entre dos puntos y un valor, pero no está en esa lista. Un espacio de ancho cero U+200B no muestra nada en absoluto, pero sigue siendo un carácter inesperado fuera de una cadena entre comillas.

Las páginas web utilizan espacios que no se separan para mantener las palabras juntas, y los sistemas de mensajería pueden insertar caracteres de ancho cero para ajustar o manejar guiones. Copiar fragmentos formateados puede llevarlos a la configuración. Reemplace los caracteres estructurales NBSP con espacios ordinarios y elimine los caracteres de ancho cero no deseados, guiándose por el desplazamiento informado.

Ejemplo resuelto: una configuración copiada de un mensaje de chat

Ejemplo resuelto: una configuración copiada de un mensaje de chat; supongamos que el texto visible se parece a `{"mode": "safe"}`, pero la validación falla al principio. Una vista hexagonal revela EF BB BF antes de la llave. Al eliminar esa lista de materiales, el siguiente informe avanza a la cotización anterior a `mode`, que en realidad es U+201C. Reemplazar ambos delimitadores inteligentes con U+0022 luego expone un U+00A0 entre los dos puntos y el valor.

Cambie ese espacio estructural sin rupturas a U+0020 y valide una vez más. El resultado aceptado ahora se puede formatear normalmente. Esta secuencia muestra por qué no es confiable reparar solo lo que la pantalla parece mostrar: varios caracteres invisibles o parecidos pueden ocupar diferentes posiciones gramaticales. Siga cada línea y columna, identifique el punto de código real, realice un reemplazo intencional y vuelva a ejecutar la validación.

Cómo ver lo invisible

Cómo ver lo invisible: habilite la opción de renderizar espacios en blanco del editor para distinguir pestañas de espacios y revelar espacios inusuales, luego use un inspector Unicode o una vista hexadecimal para caracteres que aún parecen idénticos. Una lista de materiales UTF-8 aparece como EF BB BF, un espacio sin separación como C2 A0 y un espacio de ancho cero como E2 80 8B. Las cotizaciones inteligentes de apertura y cierre aparecen como E2 80 9C y E2 80 9D.

Haga coincidir el sistema de coordenadas del diagnóstico antes de contar. ToolAcre escanea una cadena de JavaScript, por lo que sus columnas cuentan unidades de código UTF-16 en lugar de UTF-8 bytes. Por lo tanto, un editor hexadecimal orientado a bytes puede mostrar un desplazamiento numérico mayor después de caracteres que no son ASCII. Utilice la línea informada para limitar la búsqueda, inspeccionar los puntos de código vecinos y traducir solo según sea necesario.

Lo que esto no cubre

Lo que esto no cubre: mojibake como `café` puede ser completamente válido JSON. El analizador ve una secuencia ordinaria de caracteres de cadena y no tiene evidencia de que UTF-8 bytes hayan sido decodificados previamente como otra codificación. Del mismo modo, un espacio sin separación o un carácter de ancho cero dentro de un valor entre comillas es sintácticamente válido. La validación detecta caracteres que violan la gramática JSON; no puede decidir si el contenido Unicode válido coincide con la intención del autor.

Repare la corrupción de codificación en el límite donde los bytes se convierten en texto, utilizando el conocimiento de las codificaciones originales y erróneas. No codifique y decodifique repetidamente una cadena JSON hasta que se vea mejor, porque eso puede dañar los caracteres que ya son correctos. La normalización a nivel de aplicación también es una decisión separada: secuencias Unicode visualmente idénticas pueden compararse de manera diferente sin dejar de ser válidas.

Conclusión: confíe en la columna informada incluso cuando la línea parezca limpia

Conclusión: confíe en la columna informada incluso cuando la línea parezca limpia: los caracteres invisibles y la puntuación similar aún ocupan posiciones precisas en la fuente. Una lista de materiales inicial, un delimitador rizado, un espacio sin separación o una marca de ancho cero pueden impedir que un analizador alcance la llave o la cita que parece correcta. Revele espacios en blanco, inspeccione puntos de código o bytes y reemplace el carácter cuya identidad entre en conflicto con su función gramatical en lugar de editar al azar el JSON visible cercano.

Recuerde que las posiciones pueden contar caracteres mientras que una herramienta hexadecimal cuenta bytes codificados, así que compare el texto circundante en lugar de esperar que todos los números de desplazamiento coincidan. Elimine una lista de materiales solo en el límite del documento, convierta delimitadores inteligentes a U+0022 y reemplace el espaciado estructural no válido sin borrar cadenas internas Unicode legítimas.