¿Se permiten cadenas de varias líneas en JSON?

Resuelto Anonnobody asked hace 14 años • 0 respuestas

¿Es posible tener cadenas de varias líneas en JSON?

Es principalmente para comodidad visual, así que supongo que puedo activar el ajuste de palabras en mi editor, pero tengo un poco de curiosidad.

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 una gran cantidad de errores, ya sea que lo use \o \ncomo escape.

Anonnobody avatar Mar 06 '10 21:03 Anonnobody
Aceptado

Desafortunadamente, muchas de las respuestas aquí abordan la cuestión de cómo colocar 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 brindan "soluciones" que suponen que uno es libre de cambiar la representación de los datos, lo que en muchos casos no es así).

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 en líneas, aún puedes 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 puedes decirle que concatene cadenas. Su gramática (bastante pequeña) tampoco incluye ninguna posibilidad de representar una cadena en varias líneas.

A menos que se diseñe un preprocesador de algún tipo (y yo, por mi parte, no tengo ganas de crear mi propio lenguaje para resolver este problema), no existe 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 que sea legible por humanos.

Mark Adelsberger avatar Sep 28 '2018 14:09 Mark Adelsberger

JSON no permite saltos de línea reales. Debes 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 debería escribirse como:

"first line\\nsecond line"

donde \\es para escapar de la barra invertida; de lo contrario, Python lo tratará \ncomo el carácter de control "nueva línea"

YOU avatar Mar 06 '2010 15:03 YOU

Tuve que hacer esto para un pequeño proyecto de Node.js y encontré esta solución alternativa para almacenar cadenas de varias líneas como una matriz de líneas para que sea más legible para los humanos (a un costo de código adicional para convertirlas en cadenas más adelante):

{
 "modify_head": [

  "<script type='text/javascript'>",
  "<!--",
  "  function drawSomeText(id) {",
  "  var pjs = Processing.getInstanceById(id);",
  "  var text = document.getElementById('inputtext').value;",
  "  pjs.drawText(text);}",
  "-->",
  "</script>"

 ],

 "modify_body": [

  "<input type='text' id='inputtext'></input>",
  "<button onclick=drawSomeText('ExampleCanvas')></button>"
 
 ],
}

Una vez analizado, simplemente uso myData.modify_head.join('\n')o myData.modify_head.join(), dependiendo de si quiero un salto de línea después de cada cadena o no.

Esto me parece bastante interesante, aparte de eso, tengo que usar comillas dobles en todas partes. Aunque de lo contrario, tal vez podría usar YAML, pero eso tiene otros inconvenientes y no es compatible de forma nativa.

errordeveloper avatar Oct 12 '2011 18:10 errordeveloper

¡Mira las especificaciones ! La producción de caracteres de la gramática JSON puede tomar los siguientes valores:

  • cualquier-carácter-Unicode-excepto- "-o- \-o-carácter-de-control
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u cuatro dígitos hexadecimales

Las nuevas líneas son "caracteres de control", por lo que no, es posible que no tenga una nueva línea literal dentro de su cadena. Sin embargo, puedes codificarlo usando cualquier combinación de \ny \rque necesites.

Lightness Races in Orbit avatar May 22 '2013 11:05 Lightness Races in Orbit