Um valor JSON pode conter uma string multilinha

114

Estou escrevendo um arquivo JSON que seria lido por um programa Java. O fragmento é o seguinte ...

{
  "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"
    }
  }
}
user2409155
fonte
4
possível duplicata de strings Multiline em JSON
Lightness Races in Orbit
17
Eu acho que isso é mais sobre a legibilidade do arquivo JSON serializado e não sobre quebras de linha nos dados carregados (portanto, não uma duplicata de strings Multiline em JSON ). Pense nisso mais como usar JSON como um arquivo de configuração em que você tem uma string longa e, para facilitar a leitura, é útil embrulhar a string no caso de alguém a estar editando por meio de um editor de texto.
zashu
2
@zashu: A maioria dos editores de texto tem uma função de quebra automática. Isso é imediatamente mais útil do que alguma largura de linha embutida em código.
Lightness Races in Orbit de
4
@LightnessRacesinOrbit executar git diffs (ou resolver conflitos de mesclagem) em arquivos com linhas tão longas também é uma dor.
Hubert Kario
1
Este é um truque de string multilinha em JSON, citando a pergunta de OP: " É possível ter strings multilinhas em JSON? É principalmente para conforto visual, então suponho que posso apenas ativar a quebra de linha no meu editor, mas só estou curioso ... "
Andre Figueiredo

Respostas:

61

Confira a especificação ! A produção de char da gramática JSON pode assumir os seguintes valores:

  • any-Unicode-character-except- "-ou- \-ou-control-character
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u quatro dígitos hexadecimais

Novas linhas são "caracteres de controle", portanto, não, você pode não ter uma nova linha literal em sua string. No entanto, você pode codificá-lo usando qualquer combinação de \ne que \rdesejar.

A ferramenta JSONLint confirma que seu JSON é inválido.


Atualização: E se você deseja escrever novas linhas dentro de sua sintaxe JSON sem realmente incluir novas linhas nos dados, então você está duplamente sem sorte. Embora JSON tenha o objetivo de ser amigável até certo ponto, ainda são dados e você está tentando aplicar formatação arbitrária a esses dados. JSON não é absolutamente isso.

Lightness Races in Orbit
fonte
32

Não tenho certeza do seu requisito exato, mas uma solução possível para melhorar a 'legibilidade' é armazená-lo como um array.

{
  "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."]
    }
  }
}

}

A junção de volta sempre que necessário com

result.join(" ")
Brian McAuliffe
fonte
13
Mas isso é pouco semântico. É um vazamento de abstração. Eu consideraria um formato de dados especificado dessa forma como essencialmente quebrado.
Lightness Races in Orbit de
4
Não consigo imaginar projetar um documento API ou JSON dessa maneira apenas para aumentar a legibilidade da string (apenas por motivos de depuração, eu acho): | ....
Adam Dyga
"Eu consideraria um formato de dados especificado dessa forma como essencialmente quebrado." Porém, considere que se trata de um caso de teste. Se você deseja codificar cadeias de caracteres, provavelmente deseja um arquivo de propriedades. Eu pessoalmente não armazenaria dados "reais" em JSON em circunstâncias normais. Mas se esta é uma maneira simples de ir de nenhum teste para teste, então vá em frente.
sf_jeff
@AdamDyga na verdade poderia ser útil para armazenar os arquivos json em um CVS, onde a unidade delta é a linha.
yota
7

Não é uma solução muito boa, mas você pode tentar a ferramenta hjson . Link . Ele permite que você escreva um texto multilinha no editor e depois o converta para o formato JSON válido adequado. Nota: adiciona caracteres '\ n' para as novas linhas, mas você pode simplesmente excluí-los em qualquer editor de texto com a função "Substituir tudo ..".

PS Deve ser um comentário à pergunta, mas não tenho repositório suficiente, desculpe.

CodeMonkey
fonte
Essa é uma boa ideia, na verdade. Controle de versão do Hjson e transpile-o para JSON conforme necessário.
Lightness Races in Orbit
3

Pelo que pude entender, a questão não é sobre como passar uma string com símbolos de controle usando, jsonmas como armazenar e restaurar json em um arquivo onde você pode dividir uma string com símbolos de controle do editor.

Se você deseja armazenar strings de várias linhas em um arquivo, seu arquivo não armazenará o jsonobjeto válido . Mas se você usar seus jsonarquivos apenas em seu programa, poderá armazenar os dados como deseja e remover todas as novas linhas do arquivo manualmente cada vez que carregá-lo no programa e depois passar para o analisador json.

Ou, alternativamente, o que seria melhor, você pode ter seus jsonarquivos de fonte de dados onde edita um sting como quiser e, em seguida, remover todas as novas linhas com algum utilitário para o jsonarquivo válido que seu programa usará.

JustAnotherCurious
fonte
2

Eu acredito que depende de qual interpretador json você está usando ... em javascript simples você poderia usar terminadores de linha

{
  "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 Best
fonte
Isso está correto, mas os espaços de recuo produzirão: a\ c=> a c.
Andre Figueiredo
1
JavaScript não tem "intérprete JSON" que aceitaria isso. Só pode receber JSON em uma string. É verdade que, se você forneceu JSON dentro de um literal de string, pode adotar essa abordagem, mas isso é incomum. Você está confundindo JSON com declarações reais de objetos em JavaScript?
Lightness Races in Orbit