Am'm a scris unele fișiere de date în format JSON și-ar dori să aibă un foarte lung șir de valori împărțită pe mai multe linii. Folosind python's JSON modulul I obține o mulțime de erori, dacă am folosi \
sau \n
ca o evadare.
Este posibil de a avea multi-linie siruri de caractere în JSON? L's cea mai mare parte pentru confort vizual, deci cred că pot transforma doar word wrap în editorul meu, dar am'm doar curios.
JSON nu permite reali line-break. Aveți nevoie pentru a înlocui toate sfârșiturile de linie cu \n
.
de exemplu:
"prima linie a doua linie"
poate a salvat cu:
"prima linie\nsecond linie"
Notă:
pentru "Pitonul", acest lucru ar trebui să fie scris ca:
"prima linie\\nsecond linie"
unde \\
este pentru a scăpa de backslash, altfel python va trata \n
ca
caracterul de control "noua linie"
Am avut de a face acest lucru pentru o mică Node.js proiectul și-a găsit acest work-around:
{
"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>"
],
}
Acest lucru pare destul de curat pentru mine, în afară de faptul că trebuie să utilizați ghilimele peste tot. Deși în caz contrar, am putea, probabil, utilizați YAML, dar care are alte capcane și nu este suportat nativ. Odată analizat, am folosi doar myData.modify_head.alăturați-vă('\n') " sau " myData.modify_head.join()
, în funcție de faptul dacă vreau o linie de pauză după fiecare șir sau nu.
Check out caietul de sarcini! JSON gramatica's char de producție poate lua următoarele valori:
"
sau\
-sau-control-character\"
\\
\/
\b
\f
\n
\r
\t
\u
four-hex-digitsLiniile sunt "caractere de control" deci, nu, nu poate fi un literal newline în șir. Cu toate acestea te pot codifica folosind orice combinație de \n
și \r
de care aveți nevoie.
Din păcate, multe dintre răspunsuri aici adresa întrebarea cum de a pune o linie nouă de caractere în șirul de date. Întrebarea este cum de a face codul arata mai frumos, prin divizarea valoarea șir de caractere pe mai multe linii de cod. (Și chiar răspunsurile pe care recunosc acest lucru oferă "solutii", care presupune unul este gratuit pentru a modifica datele reprezentare, care în multe cazuri nu este.)
Iar vestea și mai rea este, nu există nici un răspuns bun.
În multe limbaje de programare, chiar dacă ei nu't în mod explicit sprijinul divizarea siruri de caractere peste linii, puteți utiliza în continuare de concatenare șir pentru a obține efectul dorit; și atâta timp cât compilatorul e't de îngrozitor acest lucru este bine.
Dar json nu este un limbaj de programare; it's doar o reprezentare a datelor. Puteți't-l spun pentru a concatena șiruri. Nici nu-sale (destul de mic) gramatica include orice facilitate pentru care reprezintă un șir de caractere pe mai multe linii.
Scurt de a elabora un pre-procesor de vreun fel (și eu, unul, nu't simt ca mod eficient de a face propria mea limbă să rezolve această problemă), nu e't o soluție generală la această problemă. DACĂ puteți schimba formatul de date, atunci puteți înlocui o matrice de siruri de caractere. De altfel, acesta este unul dintre numeroasele moduri în care json e't concepute pentru lizibilitate.
Aceasta este o întrebare veche, dar am dat peste asta pe o căutare și cred că știu de sursa de problema ta.
JSON nu permite "reală" liniile noi în datele sale; ea poate doar să fi scăpat newline. Vezi răspunde @TU. În funcție de cauză, se pare că a încercat să evadeze pauze de linie în Python două moduri: folosind linia de continuarea caracter ("\"
) sau prin utilizarea"\n" ca o evadare.
Dar ține minte: dacă utilizați un șir în python, special scăpat de caractere ("\t de"
, "\n"
) sunt traduse în adevărate caractere de control! La `"\n" va fi înlocuit cu caracter de control din setul ASCII care reprezintă un caracter newline, care este exact personajul care este ilegal în JSON. (Ca pentru linia continuarea caracter, pur și simplu ia newline afară.)
Deci, ceea ce trebuie să faceți este de a preveni Python de la evadarea de caractere. Puteți face acest lucru prin utilizarea unui șir prime (pus " r " în fața șirului, ca în r"abc\ndef"
, sau prin includerea un plus de slash in fata newline ("abc\\ndef"
).
Ambele de mai sus va fi, în loc de a înlocui `"\n" cu real newline ASCII caracter de control, va las"\n" ca două caractere literal, care apoi JSON poate interpreta ca o linie nouă de evacuare.
Este posibil de a avea multi-linie siruri de caractere în JSON?
Da. Am testat acum cu meu Firefox browser-ul web, prin apasarea tastei F12, făcând clic pe consolă și tastarea în partea de jos a ecranului.
x={text:"hello\nworld"}
Obiect x a fost creat dintr-un șir format JSON conțin un multi-linie de șir.
console.log(x.text)
hello
world
x.textul este afișat arată că acesta este un multi-linie de șir.
Aceste două teste arată că Firefox's Javascript interpretul este fericit de a crea și de a folosi JSON cu multilinie siruri de caractere.
Mai multe teste cu JSON.stringify " și " JSON.analiza a arătat Javascript interpret poate converti un obiect care conține mai multe linii de siruri de caractere pentru a JSON și analiza din nou cu nici o problema la toate.
Am în trecut stocate operele complete ale lui Shakespeare ca o proprietate într-un obiect JSON și apoi a trimis-o pe internet, necorupt.
Aici este o linie de două coarde intrat peste trei linii
x={text:"expert\
s\nex\
change"}
Putem afișa un obiect
console.log(x)
da
Object { text: "experts\nexchange" }
sau string
console.log(x.text)
da
experts
exchange
Sfârșitul de linii în șir rezultă din utilizarea \n și mai multe linii de intrare sunt realizate folosind doar \ la capăt de linie.
În practică s-ar putea doriți să sincronizați capetele de linie cu cele în șir, de exemplu
x={text:"experts\n\
exchange"}
console.log("Hello\nWorld".length)
11
console.log("Hello World".length)
11
Rețineți că șirul cu newline nu este mai mult decât un șir de spațiu. Chiar dacă cele două personaje au fost tastate pe tastatură ('\' si 'n'), doar un singur caracter este stocat în șir.
Scrie valoarea proprietății ca o matrice de siruri de caractere. Ca exemplu dat pe aici https://gun.io/blog/multi-line-strings-in-json/. Acest lucru va ajuta.
Putem folosi matrice de siruri de caractere pentru multilinie siruri de caractere cum ar fi următoarele.
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
Și putem cu ușurință repeta matrice pentru a afișa conținut în mai multe linii de moda.
Utilizarea json5 (loader) a se vedea https://json5.org/ - exemplu (de json5)
{
lineBreaks: "Look, Mom! \
No \\n's!",
}
Dacă sunteți dispus să utilizeze Node.js, puteți face acest lucru:
module.exports = {
multilineStr: `
dis my life
it's now or never
`
}
puteți importa cu Node.js și converti la JSON cu ușurință astfel:
echo `node -pe 'JSON.stringify(require("./json-mod.js"))'`
și veți obține:
{"multilineStr":"\n \n dis my life\n it's now or never\n \n "}
cum funcționează: utilizați Node.js pentru a încărca un JS module, care creează un JS obiect care poate fi ușor JSON stringified de Node.js. Opțiunea-e evaluează șir, și -p
opțiune ecouri se întoarcă rezultatul din ultima Node.js funcționarea la stdout.
Dacă doriți să încărcați o .script js care's într-un alt director de lucru, trebuie să porniți "" si '' siruri de caractere:
my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`
Încercați să utilizați base64
codificat valoare șir. A lucrat pentru mine mai din timp.
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
după base64` codificat șir arata ca
{
"singleLine": "Some singleline String",
"multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ=="
}
base64 codare și decodare este disponibil în toate limbile.