Bisakah nilai JSON berisi string multiline

114

Saya sedang menulis file JSON yang akan dibaca oleh program Java. Fragmennya adalah sebagai berikut ...

{
  "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"
    }
  }
}
pengguna2409155
sumber
4
kemungkinan duplikat string Multiline di JSON
Lightness Races di Orbit
17
Saya pikir ini lebih tentang keterbacaan file JSON serial dan bukan tentang linebreak dalam data yang dimuat (dengan demikian, bukan duplikat string Multiline di JSON ). Anggap saja lebih seperti menggunakan JSON sebagai file konfigurasi di mana Anda memiliki string panjang dan, untuk keterbacaan, akan sangat membantu untuk membungkus string dengan keras jika seseorang mengeditnya melalui editor teks.
zashu
2
@zashu: Kebanyakan editor teks memiliki fungsi soft-wrap. Itu segera lebih berguna daripada beberapa lebar garis hard-code.
Balapan Ringan di Orbit
4
@LightnessRacesinOrbit menjalankan git diffs (atau menyelesaikan konflik penggabungan) pada file dengan baris yang panjang juga merepotkan.
Hubert Kario
1
Ini adalah dupe a dari Multiline string di JSON, mengutip pertanyaan OP itu: " Apakah mungkin memiliki string multi-baris di JSON? Ini sebagian besar untuk kenyamanan visual jadi saya kira saya bisa mengaktifkan word wrap di editor saya, tapi saya Saya hanya ingin tahu ... "
Andre Figueiredo

Jawaban:

61

Simak spesifikasinya ! Produksi karakter tata bahasa JSON dapat mengambil nilai berikut:

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

Baris baru adalah "karakter kontrol" jadi, tidak, Anda mungkin tidak memiliki baris baru literal dalam string Anda. Namun Anda dapat menyandikannya menggunakan kombinasi apa pun \ndan yang \rAnda butuhkan.

Alat JSONLint mengonfirmasi bahwa JSON Anda tidak valid.


Pembaruan: Dan jika Anda ingin menulis baris baru di dalam sintaks JSON Anda tanpa benar-benar memasukkan baris baru dalam data, maka Anda bahkan kurang beruntung. Meskipun JSON dimaksudkan untuk menjadi ramah manusia pada tingkat tertentu, itu masih berupa data dan Anda mencoba menerapkan pemformatan sewenang-wenang ke data itu. Itu sama sekali bukan tentang JSON.

Balapan Ringan dalam Orbit
sumber
32

Saya tidak yakin dengan persyaratan pasti Anda tetapi satu solusi yang mungkin untuk meningkatkan 'keterbacaan' adalah menyimpannya sebagai 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."]
    }
  }
}

}

Bergabung kembali jika diperlukan dengan

result.join(" ")
Brian McAuliffe
sumber
13
Itu tidak romantis. Ini kebocoran abstraksi. Saya akan menganggap format data yang ditentukan dengan cara ini, pada dasarnya, rusak.
Balapan Ringan di Orbit
4
Saya tidak dapat membayangkan mendesain dokumen API atau JSON dengan cara ini hanya untuk meningkatkan keterbacaan string (saya rasa hanya untuk alasan debugging): | ....
Adam Dyga
"Saya akan menganggap format data yang ditentukan dengan cara ini, pada dasarnya, rusak." Pertimbangkan bahwa ini untuk kasus uji. Jika Anda ingin string kode keras, Anda mungkin menginginkan file properti. Saya pribadi tidak akan menyimpan data "nyata" di JSON dalam keadaan normal. Tetapi jika ini adalah cara sederhana untuk beralih dari tanpa tes ke tes, maka lakukanlah.
sf_jeff
@AdamDyga sebenarnya bisa berguna untuk menyimpan file json ke dalam CVS, di mana unit delta adalah baris.
yota
7

Bukan solusi yang cukup bagus, tetapi Anda dapat mencoba hjson alat . Tautan . Ini memungkinkan Anda untuk menulis teks multi-baris di editor dan kemudian mengubahnya menjadi format JSON yang valid. Catatan: ini menambahkan karakter '\ n' untuk baris baru, tetapi Anda dapat dengan mudah menghapusnya di editor teks manapun dengan fungsi "Ganti semua ..".

PS Harus ada komentar untuk pertanyaan itu, tetapi tidak memiliki cukup repo, maaf.

CodeMonkey
sumber
Itu ide yang bagus sebenarnya. Versi mengontrol Hjson dan membuatnya ditranspilasi ke JSON sesuai kebutuhan.
Balapan Lightness di Orbit
3

Seperti yang saya mengerti, pertanyaannya bukan tentang bagaimana melewatkan string dengan simbol kontrol menggunakan jsontetapi bagaimana menyimpan dan mengembalikan json dalam file di mana Anda dapat membagi string dengan simbol kontrol editor.

Jika Anda ingin menyimpan string multiline dalam sebuah file maka file Anda tidak akan menyimpan jsonobjek yang valid . Tetapi jika Anda menggunakan jsonfile Anda hanya dalam program Anda, maka Anda dapat menyimpan data sesuai keinginan dan menghapus semua baris baru dari file secara manual setiap kali Anda memuatnya ke program Anda dan kemudian diteruskan ke json parser.

Atau, sebagai alternatif, mana yang lebih baik, Anda dapat memiliki jsonfile sumber data di mana Anda mengedit gambar sesuai keinginan dan kemudian menghapus semua baris baru dengan beberapa utilitas ke jsonfile valid yang akan digunakan program Anda.

JustAnotherCurious
sumber
2

Saya percaya itu tergantung pada interpreter json apa yang Anda gunakan ... dalam javascript biasa Anda dapat menggunakan terminator baris

{
  "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 Terbaik
sumber
Ini benar, tetapi ruang indentasi akan menampilkan: a\ c=> a c.
Andre Figueiredo
1
JavaScript tidak memiliki "juru bahasa JSON" yang akan menerima ini. Ini hanya dapat menerima JSON dalam sebuah string. Benar, jika Anda memberikan JSON di dalam string literal maka Anda dapat mengambil pendekatan ini, tetapi itu adalah hal yang tidak biasa untuk dilakukan. Apakah Anda bingung membedakan JSON dengan deklarasi objek aktual di JavaScript?
Lightness Races di Orbit