2010-03-06 510 views
359

Estoy escribiendo algunos archivos de datos en formato JSON y me gustaría tener algunos valores de cadena muy largos divididos en varias líneas. Usando el módulo JSON de python, recibo muchos errores, ya sea que use \ o \n como escape.Cadenas de líneas múltiples en JSON

¿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 palabras en mi editor, pero estoy un poco curioso ...

+1

duplicado posible de [? ¿Cómo se gestionan los saltos de línea en JSON] (https://stackoverflow.com/questions/42068/how-do-i-handle-newlines-in-json) – Flimzy

Respuesta

227

JSON no permite saltos de línea reales. Debe reemplazar todos los saltos de línea en \n.

+55

-1 El OP * está * usando la secuencia de escape "\ n". No funciona porque no están * escapando de la barra invertida *, como "\\ n", por lo que Python está convirtiendo la secuencia de escape en un carácter de nueva línea en lugar de dejarlo literalmente como una barra invertida seguida de una, como lo requiere JSON. – user359996

+4

@ user359996 No estoy seguro de que sea cierto. Para mí (almacenar datos en JSON con solo '\ n' y enviarlo a través de Curses),' \ n' parece funcionar bien. Depende del motor de visualización/representación, parece. – ashes999

+2

Las secuencias de Newline son de hecho específicas de la plataforma (consulte http://en.wikipedia.org/wiki/Newline#Representations). Sin embargo, por @Lightness Races en la respuesta de Orbit, ni los caracteres de retorno de cursor ni de avance de línea están en la gramática de JSON. En realidad, no soy un programador de Python, así que no estoy seguro de lo que está pasando en su caso, pero su analizador está roto o no lo está transmitiendo como usted cree que es. Tal vez esta respuesta lo explique mejor: http://stackoverflow.com/a/9295597/359996. Tenga en cuenta especialmente el bit sobre el doble escape. – user359996

145

que he tenido que hacer esto para un proyecto pequeño Node.js y encontramos esta trabajo en torno:

{ 
"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>" 

], 
} 

Esto parece bastante ordenada para mí, aparte de eso tengo que usar comillas dobles en todas partes . Aunque de lo contrario, podría, tal vez, usar YAML, pero eso tiene otros inconvenientes y no es compatible de forma nativa. Una vez analizado, solo 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.

+17

Esta es una solución para una configuración específica, no necesariamente relacionada con la pregunta. Lo que creas allí no son cadenas de varias líneas (lo que de todos modos no es posible), sino matrices con cadenas dentro de –

+2

Esto muestra cómo insertar nueva línea en cadenas, lo que NO responde a la pregunta. [Esta respuesta] (https://stackoverflow.com/a/27256893/903600) sí. – fgrieu

+1

fgrieu - uno podría concatenar fácilmente las cadenas sin agregar una nueva línea. Con esa pequeña alteración, proporciona una solución alternativa para las cadenas de varias líneas (siempre que controle la especificación del esquema JSON). Trataré de mejorar la respuesta con esto. – drrob

31

Esta es una pregunta muy antigua, pero me encontré con esto en una búsqueda y creo que sé cuál es la fuente de su problema.

JSON no permite saltos de línea "reales" en sus datos; solo puede haber escapado nuevas líneas. Ver la respuesta de @YOU, arriba. 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 usando "\ n" como escape.

Pero tenga en cuenta: si está utilizando una cadena en python, los caracteres especiales escapados ("\ t", "\ n") se traducen en caracteres de control REAL. El "\ n" se reemplazará 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 saca la nueva línea.)

Entonces, lo que debe hacer es evitar que Python escape caracteres. Usted puede hacer esto mediante el uso de una cadena de texto (poner r delante de la cadena, como en r"abc\ndef", o mediante la inclusión de una barra extra delante de la nueva línea ("abc\\ndef").

Tanto de la voluntad por encima, en lugar de sustituir "\ n" con el carácter de control ASCII de línea nueva real, dejará "\ n" como dos caracteres literales, que luego JSON puede interpretar como un escape de nueva línea.

70

Echa un vistazo the specification! carbón de producción de la gramática JSON puede tomar los siguientes valores:

  • cualquier Unicode caracteres-excepto- " -o- \ control -o caracteres
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \ucuatro hex-dígitos

saltos de línea son "caracteres de control" así que no, puede que no tenga una nueva línea literal dentro de tu hilo Sin embargo, puede codificarlo utilizando la combinación de \n y \r que necesite.

+0

Ahora es ECMA-404)) http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf – gavenkoa

+1

Esta es la respuesta correcta ya que no deja ambigüedad. Las nuevas líneas * están * permitidas, según la especificación, siempre que se escapen correctamente con el carácter de control. – Ryan

-14

poner el texto de varias líneas en el archivo txt y luego

var str = { 
    text: cat('path_to_file/text.txt') 
} 

(que trabajan en la mongodb)

+4

-1: esta es una respuesta engañosa. No es JSON válido ni funciona en javascript ya que no hay una función llamada 'cat'. –

8

Uso de expresiones regulares para reemplazar todas las apariciones de \r\n con \\n.

Esto funcionó para mí en Scala.

val newstr = str.replace("\r\n", "\\n") 
+0

¿Por qué las 3 barras diagonales inversas? – neXus

+3

@neXus No sé por qué, pero alguien lo había editado con 3 barras diagonales inversas. Gracias a LightnessRacesInOrbit por corregirlo. – Sikander

22

JSON no permite las líneas de ruptura para la legibilidad.

Lo mejor que puede hacer es usar un IDE que se ajustará en línea para usted.

+0

Un editor como BBEdit que admite el ajuste de línea "suave" es ideal. Envuelve el texto para que todo aparezca dentro del área visible de la ventana del editor, pero solo las terminaciones de línea que escribe (por ejemplo, al pulsar retorno de carro) se conservan en el archivo cuando se guarda. Facilita la edición de JSON con cadenas realmente largas sin tener que recurrir a trucos de código o hacks. – cshotton

-17

Puedes probar el lugar <div></div> entre oraciones.

+1

¿Podría esto ser incluso serio? : D –

+4

Necesita más jQuery. – undefined

+0

espero que los 2 upvotes sean por el bien de la broma –

-8

escribir cualquier texto en Notepad ++ con la línea múltiple de múltiples a continuación, pulse CTRL + A y CTRL + J para organizarlas en una línea

En archivo JSON escritura:

{ 
"key":"multi line copied from notepad++" 
} 
+0

¡Esto parece haber eliminado por completo todas las nuevas líneas! Quizás sería más útil mencionar cómo reemplazar las nuevas líneas duras con/n en Notepad ++. – Bernard

11

valor de la propiedad de escritura como una conjunto 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 de varias líneas como las siguientes.

{ 
    "singleLine": "Some singleline String", 
    "multiline": ["Line one", "line Two", "Line Three"] 
} 

Y podemos iterar fácilmente la matriz para mostrar el contenido en forma de varias líneas.

+0

Le sugiero que agregue la información en su respuesta del enlace, porque los enlaces pueden romperse en el futuro. – YoungHobbit

-5
fieldval = rs.getString(rs.getMetaData().getColumnName(i)) 
    .trim() 
    .replace("\\", "/") 
    .replace("\r\n", "\\n") 
    .replace("''", "\\n") 
    .replace("\"", "\\n"); 
+10

Algunas explicaciones aumentarían la calidad de tu respuesta. – m02ph3u5

-3

{{nombre}} {{
nombre1}}

my.opt.push ({ 'nombre': 'línea 1', 'tipo1': 'línea 2')

+0


etiqueta entre nombre y nombre1 –

3

¿Es posible tener cadenas de múltiples líneas en JSON?

Sí. 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.

x={text:"hello\nworld"} 

Objeto x acaba de crearse a partir de una cadena de formato JSON que contiene una cadena de varias líneas.

console.log(x.text) 
hello 
world 

x.text se muestra mostrando que es una cadena de varias líneas.

Estas dos pruebas muestran que el intérprete de JavaScript de Firefox se complace en crear y usar JSON con cadenas de varias líneas.

Más pruebas con JSON.stringify y JSON.parse mostraron que el intérprete de Javascript puede convertir un objeto que contiene cadenas de varias líneas a JSON y analizarlo de nuevo sin ningún problema.

He almacenado en el pasado las obras completas de Shakespeare como una propiedad en un objeto JSON y luego las he enviado a través de Internet, sin daños.

Ejemplo

Aquí es una cadena de dos líneas entrado en tres líneas

x={text:"expert\ 
s\nex\ 
change"} 

Podemos mostrar el objeto

console.log(x) 

dando

Object { text: "experts\nexchange" } 

o la cadena

console.log(x.text) 

dando

experts 
exchange 

El extremo de líneas en el resultado cadena del uso de \ n y las líneas de entrada múltiples se consiguen utilizando sólo \ 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.

x={text:"experts\n\ 
exchange"} 

Multi-Line longitud de cadena

console.log("Hello\nWorld".length) 
11 
console.log("Hello World".length) 
11 

Tenga en cuenta que la cadena con el salto de 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.

1

Wrap cada línea en cotizaciones y terminar con coma como se muestra a continuación:

"content": [ 
    "This is the first line", 
    "this is second", 
    "and so on" 
] 
+2

Esta es una matriz que contiene tres cadenas, no una cadena dividida en tres líneas. – tripleee

+0

@tripleee Este es un enfoque muy común. Incluso VSCode lo hace de esta manera. Verifique sus fragmentos de código de usuario. –

+1

Eso puede ser, pero esto no es una cadena multilínea, y por lo tanto no es realmente una respuesta a esta pregunta. – tripleee

2

No es una respuesta JSON, sino una alternativa para las personas que se ocupan de los datos "JSON-like" en el CoffeeScript.

CSON (C offee S cript O bject N flotación) maneja de forma nativa cadenas de varias líneas:

singleline: 'single line' 
multiline: ''' 
    line one 
    line two 
    line three 
    ''' 

repositorio original está disponible en https://github.com/bevry/cson.

0

simplemente puede ejecutar el código a continuación con su cadena de varias deseo entre tilde ~ personaje:

var multiLineString = ` 
this 
    is 
     the 
      multiline 
        String 

`; 
JSON.stringify(multiLineString); 
+0

Esto no responde la pregunta. Los caracteres colocados entre los caracteres de la tumba (') son literales de plantilla de ES6, cuyo foco principal es la plantilla de una cadena, no para admitir texto de líneas múltiples en este formato. Si bien puede usarlos técnicamente como se muestra aquí, todo lo que da como resultado es una cadena formateada como tal: '" "\ nEsta \ n es \ n la \ n multilínea \ n String \ n \ n" "' Cuál no es JSON válido y no responde la pregunta del OP. Las otras respuestas anteriores abordan mejor la pregunta. – TuxToaster

Cuestiones relacionadas