it-swarm.asia

String multiline dalam JSON

Saya sedang menulis beberapa file data dalam format JSON dan ingin memiliki nilai string yang sangat panjang dibagi menjadi beberapa baris. Menggunakan modul JSON python, saya mendapatkan banyak kesalahan, apakah saya menggunakan \ atau \n sebagai jalan keluar. 

Apakah mungkin untuk memiliki string multi-line di JSON? Ini sebagian besar untuk kenyamanan visual jadi saya kira saya hanya bisa mengaktifkan bungkus Word di editor saya, tapi saya hanya ingin tahu ...

466
Anonnobody

JSON tidak memungkinkan jeda baris nyata. Anda perlu mengganti semua jeda baris dengan \n.

misalnya: 

"first line second line"

dapat disimpan dengan:

"first line\nsecond line"

Catatan:

untuk Python, ini harus ditulis sebagai:

"first line\\nsecond line"

di mana \\ adalah untuk menghindari backslash, jika tidak python akan memperlakukan \n sebagai .__ karakter kontrol "baris baru"

310
YOU

Saya harus melakukan ini untuk proyek Node.js kecil dan menemukan ini bekerja-sekitar :

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

 ],
}

Ini terlihat sangat rapi bagi saya, mulai dari itu saya harus menggunakan tanda kutip ganda di mana-mana. Meskipun sebaliknya, saya bisa, mungkin, menggunakan YAML, tetapi yang memiliki jebakan lain dan tidak didukung secara native. Setelah diurai, saya hanya menggunakan myData.modify_head.join('\n') atau myData.modify_head.join(), tergantung pada apakah saya ingin sebuah baris terputus setelah setiap string atau tidak.

171
errordeveloper

Lihat spesifikasinya ! Produksi char tata bahasa JSON dapat mengambil nilai-nilai berikut:

  • any-Unicode-character-kecuali -"- atau -\- atau-control-character
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \uempat-hex-digit

Baris baru adalah "karakter kontrol" jadi, tidak, Anda mungkin tidak memiliki baris baru literal dalam string Anda. Namun Anda dapat menyandikannya menggunakan kombinasi \n dan \r apa pun yang Anda perlukan.

Ini adalah pertanyaan yang sangat lama, tetapi saya menemukan ini pada pencarian dan saya pikir saya tahu sumber masalah Anda.

JSON tidak mengizinkan baris baru "nyata" dalam datanya; itu hanya bisa lolos dari baris baru. Lihat jawab dari @YOU . Menurut pertanyaan, sepertinya Anda mencoba untuk melarikan diri dari jeda baris dalam Python dua cara: dengan menggunakan karakter kelanjutan garis ("\") atau dengan menggunakan "\n" sebagai pelarian.

Namun perlu diingat: jika Anda menggunakan string dalam python, karakter khusus yang lolos ("\t", "\n") diterjemahkan ke dalam karakter kontrol NYATA! "\n" akan diganti dengan karakter kontrol ASCII yang mewakili karakter baris baru, yang merupakan karakter yang ilegal di JSON. (Sedangkan untuk karakter kelanjutan garis, itu hanya mengeluarkan baris baru.)

Jadi yang perlu Anda lakukan adalah mencegah Python keluar dari karakter. Anda dapat melakukan ini dengan menggunakan string mentah (letakkan r di depan string, seperti pada r"abc\ndef", atau dengan memasukkan garis miring tambahan di depan baris baru ("abc\\ndef").

Kedua hal di atas, alih-alih mengganti "\n" dengan karakter kontrol baris baru ASCII, akan meninggalkan "\n" sebagai dua karakter literal, yang kemudian dapat ditafsirkan JSON sebagai pelarian baris baru.

34
HardlyKnowEm

JSON tidak mengizinkan garis putus-putus untuk dibaca.

Taruhan terbaik Anda adalah menggunakan IDE yang akan membungkus baris untuk Anda.

31
James Gentes

Sayangnya banyak jawaban di sini menjawab pertanyaan tentang bagaimana cara menempatkan karakter baris baru dalam data string. Pertanyaannya adalah bagaimana membuat kode terlihat lebih bagus dengan memisahkan nilai string di beberapa baris kode. (Dan bahkan jawaban yang mengenali ini memberikan "solusi" yang mengasumsikan seseorang bebas untuk mengubah representasi data, yang dalam banyak kasus seseorang tidak.)

Dan berita buruknya adalah, tidak ada jawaban yang bagus.

Dalam banyak bahasa pemrograman, bahkan jika mereka tidak secara eksplisit mendukung pemisahan string di seluruh baris, Anda masih dapat menggunakan penggabungan string untuk mendapatkan efek yang diinginkan; dan selama kompilernya tidak buruk, ini bagus.

Tetapi json bukanlah bahasa pemrograman; itu hanya representasi data. Anda tidak bisa mengatakannya untuk menyatukan string. Tata bahasanya (yang cukup kecil) tidak menyertakan fasilitas apa pun untuk merepresentasikan string pada banyak baris.

Singkatnya merancang pra-prosesor dari beberapa jenis (dan saya, untuk satu, tidak merasa seperti secara efektif membuat bahasa saya sendiri untuk menyelesaikan masalah ini), tidak ada solusi umum untuk masalah ini. JIKA Anda bisa mengubah format data, maka Anda bisa mengganti array string. Kalau tidak, ini adalah salah satu dari banyak cara yang tidak dirancang json untuk keterbacaan manusia.

18
Mark Adelsberger

Tulis nilai properti sebagai array string. Seperti contoh yang diberikan di sini https://gun.io/blog/multi-line-strings-in-json/ . Ini akan membantu.

Kita selalu dapat menggunakan array string untuk string multiline seperti berikut.

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

Dan kita dapat dengan mudah beralih array untuk menampilkan konten dalam mode multi-line.

11
Sandip Nirmal

Apakah mungkin untuk memiliki string multi-line di JSON?

Iya nih. Saya baru saja menguji ini sekarang dengan browser web Firefox saya dengan menekan F12, mengklik konsol dan mengetik di bagian bawah layar.

x={text:"hello\nworld"}

Objek x baru saja dibuat dari string format JSON yang berisi string multi-line.

console.log(x.text)
hello
world

x.text ditampilkan menunjukkan bahwa itu adalah string multi-line.

Dua tes ini menunjukkan bahwa penerjemah Javascript Firefox senang membuat dan menggunakan JSON dengan string multiline.

Lebih banyak tes dengan JSON.stringify dan JSON.parse menunjukkan interpreter Javascript dapat mengonversi objek yang berisi string multiline ke JSON dan menguraikannya kembali tanpa masalah sama sekali.

Di masa lalu saya telah menyimpan karya lengkap Shakespeare sebagai properti dalam objek JSON dan kemudian mengirimkannya melalui internet, tidak rusak.

Contoh

Berikut adalah string dua baris yang dimasukkan lebih dari tiga baris

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

Kami dapat menampilkan objek

console.log(x)

memberi 

Object { text: "experts\nexchange" }

atau string

console.log(x.text)

memberi 

experts
exchange

Akhir baris dalam hasil string dari menggunakan\n Dan beberapa baris input dicapai hanya menggunakan\di akhir baris.

Dalam praktiknya, Anda mungkin ingin menyinkronkan ujung garis dengan yang ada di string, mis.

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

Panjang String Multi-Line

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

Perhatikan bahwa string dengan baris baru tidak lebih panjang dari string dengan spasi. Meskipun dua karakter diketik pada keyboard ('\' dan 'n'), hanya satu karakter yang disimpan dalam string.

11
user3070485

Gunakan regex untuk mengganti semua kemunculan \r\n dengan \\n.

Ini bekerja untuk saya dalam scala.

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

Jika Anda bersedia menggunakan Node.js, Anda dapat melakukan ini:

module.exports = {

  multilineStr: `

     dis my life 
     it's now or never

  `

}

anda dapat mengimpor dengan Node.js dan mengonversinya ke JSON dengan mudah seperti:

echo `node -pe 'JSON.stringify(require("./json-mod.js"))'`

dan Anda mendapatkan:

{"multilineStr":"\n \n dis my life\n it's now or never\n \n "}

cara kerjanya : Anda menggunakan Node.js untuk memuat modul JS, yang membuat objek JS yang dapat dengan mudah dirubah menjadi JSON oleh Node.js. Opsi -e mengevaluasi string, dan opsi -p menggaungkan hasil pengembalian dari operasi Node.js terakhir ke stdout.

Jika Anda ingin memuat skrip .js yang ada di direktori kerja yang berbeda, Anda harus mengganti string "" dan '':

my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`
1
Alexander Mills

Gunakan json5 (loader) lihat https://json5.org/ - contoh (oleh json5)

{
  lineBreaks: "Look, Mom! \
No \\n's!",
}
0
Lacom