Estoy escribiendo algunos archivos de datos en formato JSON y me gustaría tener algunos valores de cadena realmente largos divididos en varias líneas. Al usar el módulo JSON de Python, obtengo muchos errores, ya sea que lo use \
o \n
como escape.
¿Es posible tener cadenas de varias líneas en JSON? Es principalmente para la comodidad visual, así que supongo que puedo activar el ajuste de texto en mi editor, pero tengo curiosidad ...
Respuestas:
JSON no permite saltos de línea reales. Debe reemplazar todos los saltos de línea con
\n
.p.ej:
"first line second line"
se puede guardar con:
"first line\nsecond line"
Nota:
para
Python
, esto debe escribirse como:"first line\\nsecond line"
donde
\\
es para escapar de la barra diagonal inversa, de lo contrario, Python tratará\n
como el carácter de control "nueva línea"fuente
\n
y enviarlos a través de Curses),\n
parece funcionar bien. Parece que depende del motor de visualización / renderizado.Tuve que hacer esto para un pequeño proyecto Node.js y encontré esta solución :
Esto se ve bastante bien para mí, además de que tengo que usar comillas dobles en todas partes. Aunque de lo contrario, podría, quizás, usar YAML, pero eso tiene otras dificultades y no es compatible de forma nativa. Una vez analizado, solo uso
myData.modify_head.join('\n')
omyData.modify_head.join()
, dependiendo de si quiero un salto de línea después de cada cadena o no.fuente
Desafortunadamente, muchas de las respuestas aquí abordan la pregunta de cómo poner un carácter de nueva línea en los datos de la cadena. La pregunta es cómo hacer que el código se vea mejor dividiendo el valor de la cadena en varias líneas de código. (E incluso las respuestas que reconocen esto proporcionan "soluciones" que suponen que uno es libre de cambiar la representación de datos, que en muchos casos no lo es).
Y la peor noticia es que no hay una buena respuesta.
En muchos lenguajes de programación, incluso si no admiten explícitamente la división de cadenas entre líneas, aún puede usar la concatenación de cadenas para obtener el efecto deseado; y mientras el compilador no sea horrible, está bien.
Pero json no es un lenguaje de programación; Es solo una representación de datos. No se puede decir que concatene cadenas. Su gramática (bastante pequeña) tampoco incluye ninguna facilidad para representar una cadena en varias líneas.
Si no diseñamos un preprocesador de algún tipo (y yo, por mi parte, no tengo ganas de inventar mi propio idioma para resolver este problema), no hay una solución general para este problema. SI puede cambiar el formato de datos, puede sustituir una serie de cadenas. De lo contrario, esta es una de las numerosas formas en que json no está diseñado para la legibilidad humana.
fuente
¡Mira la especificación ! La gramática de JSON carbón de producción puede tomar los siguientes valores:
"
-or-\
-or-control-character\"
\\
\/
\b
\f
\n
\r
\t
\u
cuatro dígitos hexadecimalesLas nuevas líneas son "caracteres de control", así que no, es posible que no tenga una nueva línea literal dentro de su cadena. Sin embargo, puede codificarlo usando cualquier combinación de
\n
y\r
que necesite.fuente
JSON no permite líneas de corte para facilitar la lectura.
Su mejor opción es usar un IDE que se ajuste a la línea por usted.
fuente
Esta es una pregunta muy antigua, pero me encontré con esto en una búsqueda y creo que conozco la fuente de su problema.
JSON no permite nuevas líneas "reales" en sus datos; solo puede haber escapado de nuevas líneas. Vea la respuesta de @YOU . Según la pregunta, parece que intentaste escapar de los saltos de línea en Python de dos maneras: usando el carácter de continuación de línea (
"\"
) o"\n"
como un escape.Pero tenga en cuenta: si está utilizando una cadena en python, los caracteres escapados especiales (
"\t"
,"\n"
) se traducen en caracteres de control REAL. El"\n"
será reemplazado con el carácter de control ASCII que representa un carácter de nueva línea, que es precisamente el carácter que es ilegal en JSON. (En cuanto al carácter de continuación de línea, simplemente elimina la nueva línea).Entonces, lo que debe hacer es evitar que Python escape de los caracteres. Puede hacer esto usando una cadena sin procesar (colocada
r
delante de la cadena, como enr"abc\ndef"
, o incluyendo una barra adicional delante de la nueva línea ("abc\\ndef"
).Ambos de los anteriores, en lugar de reemplazar
"\n"
con el carácter de control ASCII de nueva línea real, dejarán"\n"
como dos caracteres literales, que luego JSON puede interpretar como un escape de nueva línea.fuente
Escriba el valor de la propiedad como una matriz de cadenas. Como ejemplo dado aquí https://gun.io/blog/multi-line-strings-in-json/ . Esto ayudará.
Siempre podemos usar una matriz de cadenas para cadenas multilínea como las siguientes.
Y podemos iterar fácilmente la matriz para mostrar contenido en varias líneas.
fuente
Use json5 (cargador) vea https://json5.org/ - ejemplo (por json5)
fuente
¿Es posible tener cadenas de varias líneas en JSON?
Si. Acabo de probar esto ahora con mi navegador web Firefox presionando F12, haciendo clic en la consola y escribiendo en la parte inferior de la pantalla.
El objeto x acaba de crearse a partir de una cadena de formato JSON que contiene una cadena de varias líneas.
x.text se muestra mostrando que es una cadena de varias líneas.
Estas dos pruebas muestran que el intérprete Javascript de Firefox se complace en crear y usar JSON con cadenas multilínea.
Más pruebas con
JSON.stringify
yJSON.parse
demostraron que el intérprete Javascript puede convertir un objeto que contiene cadenas multilínea a JSON y analizarlo nuevamente sin ningún problema.En el pasado, almacené los trabajos completos de Shakespeare como una propiedad en un objeto JSON y luego los envié a través de Internet, sin corrupción.
Ejemplo
Aquí hay una cadena de dos líneas ingresada en tres líneas
Podemos mostrar el objeto
dando
o la cuerda
dando
El final de las líneas en la cadena resulta del uso de \ n y las múltiples líneas de entrada se logran usando solo \ al final de la línea.
En la práctica, es posible que desee sincronizar las terminaciones de línea con las de la cadena, p. Ej.
Longitud de cadena de varias líneas
Tenga en cuenta que la cadena con la nueva línea no es más larga que la cadena con el espacio. Aunque se escribieron dos caracteres en el teclado ('\' y 'n'), solo se almacena un carácter en la cadena.
fuente
x={"a":NaN}
yx={"a":"a \<literal newline with SHIFT>b"}
, que no son JSON, pero son JavaScriptUse regex para reemplazar todas las apariciones de
\r\n
con\\n
.Esto funcionó para mí en scala.
fuente
Si está dispuesto a usar Node.js, puede hacer esto:
puede importar con Node.js y convertirlo a JSON fácilmente así:
y obtienes:
cómo funciona : usa Node.js para cargar un módulo JS, que crea un objeto JS que puede ser fácilmente JSON stringified por Node.js. La opción -e evalúa la cadena, y la
-p
opción hace eco del resultado de retorno de la última operación Node.js en stdout.Si desea cargar un script .js que está en un directorio de trabajo diferente, debe cambiar las cadenas "" y '':
fuente
Intente usar un
base64
valor de cadena codificado. Trabajó para mí la mayor parte del tiempo.después de que la
base64
cadena codificada se vea comoLa codificación y decodificación base64 está disponible en todos los idiomas.
fuente
poner el texto multilínea en el archivo txt y luego
(funciona en mongoDB)
fuente
cat
.