Stringhe multilinea in JSON

Sto scrivendo alcuni file di dati in formato JSON e vorrei avere alcuni valori di stringa veramente lunghi suddivisi su più righe. Usando il modulo JSON di python ottengo un sacco di errori, sia che io utilizzi \ o \n come fuga.

È ansible avere stringhe multilinea in JSON? È soprattutto per il comfort visivo, quindi suppongo di poter semplicemente ricomporre le parole nel mio editor, ma sono solo un po ‘curioso …

JSON non consente interruzioni di riga reali. Devi sostituire tutte le interruzioni di riga con \n .

Ho dovuto farlo per un piccolo progetto Node.js e ho trovato questo work-around :

 { "modify_head": [ "" ], "modify_body": [ "", "" ], } 

Mi sembra abbastanza carino, a parte questo devo usare le virgolette ovunque. Sebbene altrimenti, potrei, forse, usare YAML, ma questo ha altre insidie ​​e non è supportato in modo nativo. Una volta analizzato, uso semplicemente myData.modify_head.join('\n') o myData.modify_head.join() , a seconda se voglio un’interruzione di riga dopo ogni stringa o meno.

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

  • any-Unicode-character-except- " -o—or-control-character
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u quattro cifre esadecimali

Le newline sono “caratteri di controllo” quindi, no, potresti non avere una nuova riga letterale all’interno della stringa. Comunque puoi codificarlo usando qualsiasi combinazione di \n e \r richiesta.

Questa è una domanda molto vecchia, ma mi sono imbattuto in questa ricerca e penso di conoscere la fonte del tuo problema.

JSON non ammette newline “reali” nei suoi dati; può avere solo newline sfuggite. Vedi la risposta di @YOU, sopra. Secondo la domanda, sembra che tu abbia tentato di sfuggire alle interruzioni di riga in Python in due modi: usando il carattere di continuazione della linea (“\”) o usando “\ n” come escape.

Ma tieni a mente: se stai usando una stringa in python, caratteri speciali di escape (“\ t”, “\ n”) sono tradotti in veri caratteri di controllo! “\ N” verrà sostituito con il carattere di controllo ASCII che rappresenta un carattere di nuova riga, che è precisamente il carattere che è illegale in JSON. (Per quanto riguarda il carattere di continuazione della linea, prende semplicemente la newline.)

Quindi quello che devi fare è impedire a Python di sfuggire ai personaggi. Puoi farlo usando una stringa raw (metti r davanti alla stringa, come in r"abc\ndef" , o includendo una barra in più davanti alla nuova riga ( "abc\\ndef" ).

Entrambi i precedenti, invece di sostituire “\ n” con il vero carattere di controllo ASCII di nuova riga, lasceranno “\ n” come due caratteri letterali, che quindi JSON può interpretare come una fuga di nuova riga.

JSON non consente linee di rottura per la leggibilità.

La soluzione migliore è utilizzare un IDE che verrà allineato per te.

Scrivi il valore della proprietà come una matrice di stringhe. Come esempio dato qui https://gun.io/blog/multi-line-strings-in-json/ . Questo aiuterà.

Possiamo sempre usare array di stringhe per stringhe multilinea come il seguente.

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

E possiamo facilmente iterare la matrice per visualizzare i contenuti in moda multi linea.

Usa regex per sostituire tutte le occorrenze di \r\n con \\n .

Questo ha funzionato per me in scala.

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

È ansible avere stringhe multilinea in JSON?

Sì. L’ho appena testato con il mio browser Firefox premendo F12, facendo clic su console e digitando nella parte inferiore dello schermo.

 x={text:"hello\nworld"} 

L’object x è appena stato creato da una stringa in formato JSON contenente una stringa multilinea.

 console.log(x.text) hello world 

x.text viene visualizzato mostrando che si tratta di una stringa su più righe.

Questi due test mostrano che l’interprete Javascript di Firefox è felice di creare e utilizzare JSON con stringhe multiline.

Altri test con JSON.stringify e JSON.parse hanno mostrato che l’interprete Javascript può convertire un object contenente stringhe multilinea in JSON e analizzarlo di nuovo senza alcun problema.

In passato ho conservato le opere complete di Shakespeare come una proprietà in un object JSON e poi l’ho inviato su Internet, senza corruzione.

Esempio

Ecco una stringa di due righe immessa su tre righe

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

Possiamo mostrare l’object

 console.log(x) 

dando

 Object { text: "experts\nexchange" } 

o la stringa

 console.log(x.text) 

dando

 experts exchange 

La fine delle righe nella stringa risulta dall’uso di \ n e le molteplici linee di input sono ottenute usando solo \ alla fine della riga.

In pratica potresti voler sincronizzare le terminazioni di linea con quelle nella stringa, ad es

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

Lunghezza della stringa multi-linea

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

Si noti che la stringa con la nuova riga non è più lunga della stringa con lo spazio. Anche se due caratteri sono stati digitati sulla tastiera (‘\’ e ‘n’), nella stringa viene memorizzato solo un carattere.

Avvolgi ogni riga in virgolette e terminale con una virgola come mostrato di seguito:

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

Usa json5 (loader) vedi https://json5.org/ – esempio (di json5)

{lineBreaks: “Guarda mamma! \ No \ n’s!”,}

Prova a utilizzare il valore stringa codificato in base64 . Ha funzionato per me la maggior parte del tempo.

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

dopo che la stringa codificata in base base64 aspetto simile

 { "singleLine": "Some singleline String", "multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ==" } 

codifica e decodifica base64 è disponibile in tutte le lingue.

{{nome}}
{{Nome1}}

my.opt.push ({ ‘name’: ‘Riga1’, ‘nome1’: ‘line2’)

potresti semplicemente eseguire il codice sottostante con la stringa multilinea desiderata tra il carattere tilde ~ :

 var multiLineString = ` this is the multiline String `; JSON.stringify(multiLineString); 

Basta includere i tag di paragrafo per renderlo ordinato e più efficiente.

Esempio: “body”: ”

Paragrafo 1 qui.

Paragrafo 2 qui.

“,

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

scrivi qualsiasi testo in notepad ++ con multi multi linea quindi premi ctl + a e ctl + j per sistemarli in una riga

Nel file json scrivi:

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

metti il ​​testo multilinea su file txt e poi

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

(funziona su mongoDB)

Puoi provare a posizionare

tra le frasi.