Bir JSON değeri çok satırlı bir dize içerebilir mi


114

Bir Java programı tarafından okunabilecek bir JSON dosyası yazıyorum. Parça aşağıdaki gibidir ...

{
  "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
Bunun serileştirilmiş JSON dosyasının okunabilirliği ile ilgili olduğunu ve yüklenen verilerdeki satır kırılmalarıyla ilgili olmadığını düşünüyorum (bu nedenle, JSON'daki Çok Satırlı dizelerin bir kopyası değil ). Daha çok, JSON'u uzun bir dizeye sahip olduğunuz bir yapılandırma dosyası olarak kullanmayı düşünün ve okunabilirlik açısından, birisinin bir metin düzenleyicisi aracılığıyla düzenlemesi durumunda dizeyi sert bir şekilde sarmak yararlıdır.
zashu

2
@zashu: Çoğu metin düzenleyicinin yumuşak sarma işlevi vardır. Bu, sabit kodlanmış bir çizgi genişliğinden hemen daha kullanışlıdır.
Orbit'te Hafiflik Yarışları

4
@LightnessRacesinOrbit'in bu kadar uzun satırlara sahip dosyalarda git diff'leri çalıştırması (veya birleştirme çakışmalarını çözmesi) de bir acıdır.
Hubert Kario

1
Bu, JSON'daki Multiline dizgisinin bir kopyasıdır ve OP'nin şu sorusuna atıfta bulunur: " JSON'da çok satırlı dizelere sahip olmak mümkün müdür? Bu çoğunlukla görsel rahatlık içindir, bu yüzden editörümde sadece kelime kaydırmayı açabileceğimi düşünüyorum, ancak ben 'sadece tür merak ettim ... "
Andre Figueiredo

Yanıtlar:


61

Spesifikasyona göz atın ! JSON dilbilgisinin karakter üretimi aşağıdaki değerleri alabilir:

  • herhangi Unicode karakter-except- "-veya- \-veya kontrol karakterli
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u Dört-heks-basamaklı

Yeni satırlar "kontrol karakterleridir", bu nedenle, hayır, dizenizde gerçek bir satırsonu satırına sahip olmayabilirsiniz. Ancak ne olursa olsun kombinasyonunu kullanarak kodlamak olabilir \nve \rsiz gerektirir.

JSONLint JSON geçersiz aracı doğruladı.


Güncelleme: Ve JSON sözdiziminizde, verilere yeni satırlar eklemeden yeni satırlar yazmak istiyorsanız, o zaman şansınız iki katına çıkar. JSON'un bir dereceye kadar insan dostu olması amaçlansa da, yine de veridir ve bu verilere rastgele biçimlendirme uygulamaya çalışıyorsunuz. JSON'un konusu kesinlikle bu değil.


32

Gereksiniminizden tam olarak emin değilim, ancak 'okunabilirliği' geliştirmek için olası bir çözüm, onu bir dizi olarak saklamaktır.

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

}

Gerektiğinde tekrar birleştirme

result.join(" ")

13
Gerçi bu anlamsız. Bu bir soyutlama sızıntısı. Bu şekilde belirtilen bir veri formatının esasen bozuk olduğunu düşünürdüm.
Orbit'te Hafiflik Yarışları

4
Sadece dize okunabilirliğini artırmak için bu şekilde bir API veya JSON belgesi tasarlamayı hayal edemiyorum (sadece tahmin ettiğim hata ayıklama nedenleriyle): | ....
Adam Dyga

"Bu şekilde belirtilen bir veri formatının aslında bozuk olduğunu düşünürdüm." Yine de bunun bir test durumu için olduğunu düşünün. Dizeleri sabit kodlamak istiyorsanız, muhtemelen bir özellikler dosyası istersiniz. Şahsen normal koşullarda JSON'da "gerçek" verileri saklamazdım. Ancak bu, testsizden teste geçmenin basit bir yoluysa, o zaman devam edin.
sf_jeff

@AdamDyga aslında json dosyalarını delta biriminin satır olduğu bir CVS'de saklamak için yararlı olabilir.
yota

7

Pek iyi bir çözüm değil, ancak hjson aracını deneyebilirsiniz . Bağlantı . Editörde çok satırlı metin yazmanıza ve ardından bunu uygun geçerli JSON biçimine dönüştürmenize olanak tanır. Not: Yeni satırlar için '\ n' karakterleri ekler, ancak bunları herhangi bir metin düzenleyicide "Tümünü değiştir .." işlevi ile silebilirsiniz.

Not: Soruyla ilgili bir yorum olmalı, ancak yeterli deponuz yok, üzgünüm.


Aslında bu iyi bir fikir. Sürüm, Hjson'u kontrol eder ve gerektiğinde JSON'a aktarılmasını sağlar.
Orbit'te Hafiflik Yarışları

3

Anladığım kadarıyla soru, kontrol sembolleri kullanılarak bir dizenin nasıl geçirileceği değil, jsonjson'un düzenleyici kontrol sembolleriyle bir dizeyi bölebileceğiniz bir dosyada nasıl saklanacağı ve geri yükleneceği ile ilgili.

Çok satırlı dizeyi bir dosyada saklamak istiyorsanız, dosyanız geçerli jsonnesneyi saklamayacaktır . Ancak jsondosyalarınızı yalnızca programınızda kullanırsanız , verileri istediğiniz gibi depolayabilir ve programınıza her yüklediğinizde ve ardından json ayrıştırıcısına geçtiğinizde tüm yeni satırları dosyadan manuel olarak kaldırabilirsiniz.

Veya alternatif olarak, daha iyi olanı, jsonveri kaynak dosyalarınızı istediğiniz gibi düzenlediğiniz ve ardından programınızın kullanacağı geçerli jsondosyaya bazı yardımcı programlarla tüm yeni satırları kaldırdığınız yerde bulundurabilirsiniz.


2

Kullandığınız json yorumlayıcısına bağlı olduğuna inanıyorum ... düz javascript'te satır sonlandırıcılar kullanabilirsiniz

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

Bu doğru, ancak girinti boşlukları çıktı: a\ c=> a c.
Andre Figueiredo

1
JavaScript'in bunu kabul edecek "JSON yorumlayıcısı" yoktur. Yalnızca bir dizede JSON alabilir. Doğru, JSON'u bir dizge dizesi içinde sağladıysanız, bu yaklaşımı benimseyebilirsiniz, ancak bu yapılması alışılmadık bir şey. JSON'u JavaScript'teki gerçek nesne bildirimleriyle karıştırıyor musunuz?
Orbit'te Hafiflik Yarışları
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.