¿Puede un valor JSON contener una cadena de varias líneas?

114

Estoy escribiendo un archivo JSON que sería leído por un programa Java. El fragmento es el siguiente ...

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble.
                  so i would like to write it in multiple lines.
                  but, i do NOT require any new lines in the output.
                  I need to split the string value in this input file only.
                  such that I don't require to slide the horizontal scroll again and again while verifying the correctness of the statements.
                  the prev line, I have shown, without splitting just to give a feel of my problem"
    }
  }
}
usuario2409155
fuente
4
posible duplicado de cadenas de varias
líneas
17
Creo que se trata más de la legibilidad del archivo JSON serializado y no de los saltos de línea en los datos cargados (por lo tanto, no es un duplicado de cadenas de líneas múltiples en JSON ). Piense en ello más como usar JSON como un archivo de configuración donde tiene una cadena larga y, para facilitar la lectura, es útil ajustar la cadena en caso de que alguien la edite a través de un editor de texto.
zashu
2
@zashu: la mayoría de los editores de texto tienen una función de ajuste suave. Eso es inmediatamente más útil que un ancho de línea codificado de forma rígida.
Lightness Races in Orbit
4
@LightnessRacesinOrbit ejecutar git diffs (o resolver conflictos de fusión) en archivos con líneas tan largas también es una molestia.
Hubert Kario
1
Esto es un engaño de una cadena de líneas múltiples en JSON, que cita la pregunta de OP: " ¿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 soy un poco curioso ... "
Andre Figueiredo

Respuestas:

61

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

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

Las líneas nuevas son "caracteres de control", así que no, es posible que no tenga una línea nueva literal dentro de su cadena. Sin embargo, puede codificarlo utilizando cualquier combinación de \ny \rnecesite.

La herramienta JSONLint confirma que su JSON no es válido.


Actualización: Y si desea escribir nuevas líneas dentro de su sintaxis JSON sin incluir nuevas líneas en los datos, entonces está doblemente fuera de suerte. Si bien JSON está diseñado para ser amigable para los humanos hasta cierto punto, sigue siendo datos y está tratando de aplicar un formato arbitrario a esos datos. Eso no es en absoluto de lo que se trata JSON.

Carreras de ligereza en órbita
fuente
32

No estoy seguro de su requisito exacto, pero una posible solución para mejorar la 'legibilidad' es almacenarlo como una matriz.

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : ["this is a very long line which is not easily readble.",
                  "so i would like to write it in multiple lines.",
                  "but, i do NOT require any new lines in the output."]
    }
  }
}

}

Volver a unirse cuando sea necesario con

result.join(" ")
Brian McAuliffe
fuente
13
Sin embargo, eso no es semántico. Es una fuga de abstracción. Consideraría que un formato de datos especificado de esta manera está, esencialmente, roto.
Lightness Races in Orbit
4
No puedo imaginarme el diseño de un documento API o JSON de esta manera solo para aumentar la legibilidad de la cadena (solo por motivos de depuración, supongo): | ....
Adam Dyga
"Consideraría que un formato de datos especificado de esta manera está, esencialmente, roto". Sin embargo, tenga en cuenta que esto es para un caso de prueba. Si desea codificar cadenas, probablemente desee un archivo de propiedades. Personalmente, no almacenaría datos "reales" en JSON en circunstancias normales. Pero si esta es una forma sencilla de pasar de no realizar pruebas a pruebas, entonces hágalo.
sf_jeff
@AdamDyga de hecho podría ser útil para almacenar los archivos json en un CVS, donde la unidad de delta es la línea.
yota
7

No es una buena solución, pero puede probar la herramienta hjson . Enlace . Le permite escribir texto con varias líneas en el editor y luego lo convierte al formato JSON válido adecuado. Nota: agrega caracteres '\ n' para las nuevas líneas, pero puede simplemente eliminarlos en cualquier editor de texto con la función "Reemplazar todo ...".

PD: Debería haber un comentario a la pregunta, pero no tengo suficiente repositorio, lo siento.

CodeMonkey
fuente
De hecho, es una buena idea. Controle la versión del Hjson y transpílelo a JSON según sea necesario.
Lightness Races in Orbit
3

Como pude entender, la pregunta no se trata de cómo pasar una cadena con símbolos de control, jsonsino de cómo almacenar y restaurar json en un archivo donde puede dividir una cadena con símbolos de control del editor.

Si desea almacenar una cadena de varias líneas en un archivo, su archivo no almacenará el jsonobjeto válido . Pero si usa sus jsonarchivos solo en su programa, entonces puede almacenar los datos como desee y eliminar todas las líneas nuevas del archivo manualmente cada vez que lo cargue en su programa y luego pase al analizador json.

O, alternativamente, lo que sería mejor, puede hacer que sus jsonarchivos de origen de datos editen una picadura como desee y luego elimine todas las líneas nuevas con alguna utilidad en el jsonarchivo válido que usará su programa.

Solo OtroCurioso
fuente
2

Creo que depende del intérprete json que esté usando ... en javascript simple, podría usar terminadores de línea

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble. \
                  so i would like to write it in multiple lines. \
                  but, i do NOT require any new lines in the output."
    }
  }
}
Elric mejor
fuente
Esto es correcto, pero los espacios de sangría darán como resultado: a\ c=> a c.
Andre Figueiredo
1
JavaScript no tiene un "intérprete JSON" que acepte esto. Solo puede tomar JSON en una cadena. Es cierto que si proporcionó JSON dentro de un literal de cadena, podría adoptar este enfoque, pero es algo inusual. ¿Confunde JSON con declaraciones de objetos reales en JavaScript?
Lightness Races in Orbit