Un valore JSON può contenere una stringa su più righe


114

Sto scrivendo un file JSON che verrebbe letto da un programma Java. Il frammento è il seguente ...

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


17
Penso che questo riguardi più la leggibilità del file JSON serializzato e non le interruzioni di riga nei dati caricati (quindi, non un duplicato di stringhe multiline in JSON ). Pensa più come usare JSON come file di configurazione in cui hai una stringa lunga e, per leggibilità, è utile avvolgere la stringa nel caso in cui qualcuno la stia modificando tramite un editor di testo.
Zashu

2
@zashu: la maggior parte degli editor di testo ha una funzione soft-wrap. È immediatamente più utile di una larghezza di linea hard-coded.
Gare di leggerezza in orbita il

4
@LightnessRacesinOrbit che esegue git diff (o risolve conflitti di unione) su file con linee così lunghe è anche un problema.
Hubert Kario

1
Questo è un duplicato di una stringa multilinea in JSON, citando la domanda dell'OP: " È possibile avere stringhe multilinea in JSON? È principalmente per comodità visiva, quindi suppongo di poter attivare il ritorno a capo automatico nel mio editor, ma io Sono solo un po 'curioso ... "
Andre Figueiredo

Risposte:


61

Controlla le specifiche ! La produzione di caratteri della grammatica JSON può assumere i seguenti valori:

  • qualsiasi carattere Unicode tranne "-oppure- \o-carattere di controllo
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u quattro cifre esadecimali

Le nuove righe sono "caratteri di controllo", quindi no, potresti non avere una nuova riga letterale all'interno della stringa. Tuttavia è possibile codificarlo utilizzando qualsiasi combinazione di \ne \rrichiesta.

Lo strumento JSONLint conferma che il tuo JSON non è valido.


Aggiornamento: E se vuoi scrivere le nuove righe all'interno della sintassi JSON senza effettivamente includere le nuove righe nei dati, allora sei anche doppiamente sfortunato. Sebbene JSON sia inteso in una certa misura per essere umano, si tratta comunque di dati e stai cercando di applicare una formattazione arbitraria a tali dati. Questo non è assolutamente ciò di cui parla JSON.


32

Non sono sicuro del tuo requisito esatto, ma una possibile soluzione per migliorare la "leggibilità" è memorizzarlo come 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."]
    }
  }
}

}

Il join torna di nuovo quando richiesto con

result.join(" ")

13
Non è semantico però. È una perdita di astrazione. Considero un formato di dati specificato in questo modo essenzialmente non funzionante.
Gare di leggerezza in orbita

4
Non riesco a immaginare di progettare un'API o un documento JSON in questo modo solo per aumentare la leggibilità delle stringhe (immagino solo per motivi di debug): | ....
Adam Dyga

"Considererei un formato di dati specificato in questo modo essenzialmente non funzionante." Considera che questo è per un caso di prova, però. Se vuoi codificare stringhe, probabilmente vorrai un file delle proprietà. Personalmente non memorizzerei dati "reali" in JSON in circostanze normali. Ma se questo è un modo semplice per passare da nessun test a test, allora fallo.
sf_jeff

@AdamDyga infatti potrebbe essere utile per memorizzare i file json in un CVS, dove l'unità di delta è la linea.
yota

7

Non è una buona soluzione, ma puoi provare lo strumento hjson . Link . Ti consente di scrivere testo su più righe nell'editor e quindi di convertirlo nel formato JSON valido appropriato. Nota: aggiunge i caratteri "\ n" per le nuove righe, ma puoi semplicemente cancellarli in qualsiasi editor di testo con la funzione "Sostituisci tutto ..".

PS Dovrebbe essere un commento alla domanda, ma non ho abbastanza repo, mi dispiace.


In realtà è una buona idea. Controlla la versione di Hjson e trasferiscilo in JSON secondo necessità.
Gare di leggerezza in orbita il

3

Come ho potuto capire, la domanda non riguarda come passare una stringa con i simboli di controllo usando, jsonma come memorizzare e ripristinare json in un file in cui è possibile dividere una stringa con i simboli di controllo dell'editor.

Se si desidera memorizzare una stringa multilinea in un file, il file non memorizzerà l' jsonoggetto valido . Ma se usi i tuoi jsonfile solo nel tuo programma, puoi memorizzare i dati come desideri e rimuovere manualmente tutte le nuove righe dal file ogni volta che lo carichi nel programma e poi passare al parser json.

Oppure, in alternativa, il che sarebbe meglio, puoi avere i tuoi jsonfile di origine dati in cui modifichi una puntura come desideri e quindi rimuovere tutte le nuove linee con qualche utilità nel jsonfile valido che il tuo programma utilizzerà.


2

Credo che dipenda dall'interprete JSON che stai usando ... in javascript semplice potresti usare i terminatori di riga

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

Questo è corretto, ma gli spazi di rientro restituiranno: a\ c=> a c.
Andre Figueiredo

1
JavaScript non ha un "interprete JSON" che lo accetti. Può accettare solo JSON in una stringa. È vero, se hai fornito JSON all'interno di una stringa letterale, potresti adottare questo approccio, ma è una cosa insolita da fare. Stai confondendo JSON con le dichiarazioni di oggetti effettivi in ​​JavaScript?
Gare di leggerezza in orbita il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.