JSON'da çok satırlı dizeler


656

JSON biçiminde bazı veri dosyaları yazıyorum ve bazı satırlar üzerinde bölünmüş gerçekten uzun dize değerleri istiyorum. Python JSON modülünü kullanarak kullandığım olsun, hataların bir sürü almak \veya \nbir kaçış olarak.

JSON'da çok satırlı dizeler olması mümkün müdür? Çoğunlukla görsel konfor için, bu yüzden editörümde sadece kelime sarmayı açabileceğimi düşünüyorum, ama biraz merak ediyorum ...



1
Verilerinizi yapılandırın: çok satırlı dizeyi bir dizgi dizisine bölün ve daha sonra bunları birleştirin.
RubyTuesdayDONO

2
Hjson aracını deneyin. Bu json çok satırlı Dize uygun json biçimine dönüştürecektir.
gaurav

Yanıtlar:


403

JSON , gerçek satır sonlarına izin vermez. Tüm satır sonlarını değiştirmeniz gerekir \n.

Örneğin:

"first line second line"

ile kaydedilebilir:

"first line\nsecond line"

Not:

çünkü Pythonbu şu şekilde yazılmalıdır:

"first line\\nsecond line"

\\ters eğik \nçizgiden kaçmak için nerede , aksi takdirde python kontrol karakteri "yeni satır" olarak kabul edecek


89
-1 OP olan "\ n" kaçış dizisi kullanılmıştır. Bu işe yaramıyor çünkü ters eğik çizgiden "\\ n" olarak kaçmıyorlar, bu yüzden Python kaçış dizisini JSON'un gerektirdiği şekilde bir ters eğik çizgi ve ardından bir en olarak bırakmak yerine yeni satır karakterine dönüştürüyor.
user359996

6
@ user359996 Bunun doğru olduğundan emin değilim. Benim için (sadece \nJSON'da veri depolamak ve Curses üzerinden çıktı almak), \niyi çalışıyor gibi görünüyor. Görünüşe / oluşturma motoruna bağlıdır, öyle görünüyor.
ashes999

2
Yeni satır dizileri gerçekten de platforma özgüdür (çapraz başvuru en.wikipedia.org/wiki/Newline#Representations ). Ancak, Orbit'in cevabındaki @Lightness Races'e göre, ne imleç döndürme ne de satır besleme karakterleri JSON dilbilgisinde değildir. Aslında bir Python programcısı değilim, bu yüzden davanızda neler olup bittiğinden emin değilim, ya ayrıştırıcınız bozuldu ya da düşündüğünüzü geçmiyorsunuz. Belki bu cevap daha iyi açıklar: stackoverflow.com/a/9295597/359996 . Özellikle çift kaçış hakkında biraz dikkat edin.
user359996

5
@Nawaz: "\ n" ve "\ r" , sırasıyla satır besleme ve satır başı için kaçış dizileridir . Bunlar gerçek satır besleme ve satır başı denetim karakterleri değildir . Daha açık hale getirmek için ek bir örnek olarak, "\\" ifadesinin gerçek ters eğik çizginin aksine ters eğik çizgi için bir kaçış dizisi olduğunu düşünün . JSON dilbilgisi, kontrol karakterlerini (cf. "karakter" tanımı) açıkça hariç tutar ve bunun yerine kaçış dizileri (\\, \ r, \ n, vb.) Üzerinden temsil edilmesini sağlar.
user359996

2
@ user359996: Evet .. Daha sonra gördüm, eski yorumumu böyle tutmama rağmen, başka birinin aynı şüpheyle gelmesi durumunda, tartışmamız onlara yardımcı olabilir. BTW'yi onayladığınız için teşekkür ederiz.
Nawaz

197

Küçük bir Node.js projesi için bunu yapmak zorunda kaldı ve bu geçici çözüm bulundu :

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

 ],
}

Bu benim için oldukça temiz görünüyor, ondan her yerde çift tırnak kullanmak zorundayım. Aksi halde, belki de YAML'yi kullanabilirdim, ancak bunun başka tuzakları var ve yerel olarak desteklenmiyor. Ayrıştırıldıktan sonra, her dizeden sonra bir satır sonu isteyip istemediğime bağlı olarak, sadece myData.modify_head.join('\n')veya kullanın myData.modify_head.join().


40
Bu, soru ile ilgili olması gerekmeyen belirli bir ortam için bir çözümdür. Yarattığınız şey çok satırlı dizeler (zaten mümkün değil) değil, içeride dizeleri olan diziler
Samuel Rivas

3
Bu, soruyu cevaplamayan dizelere yeni satırın nasıl ekleneceğini gösterir. Bu cevap .
fgrieu

1
fgrieu - yeni satır eklemeden dizeleri kolayca birleştirebilirsiniz. Bu küçük değişiklikle, çok satırlı dizeler için bir geçici çözüm sağlar (JSON şemasını belirleme denetiminde olduğunuz sürece). Bununla cevabı geliştirmeye çalışacağım.
drrob

1
Teşekkürler, beğendim. Üzerinde çalıştığım şey için bununla devam ediyorum. Düzgün ve düzenli görünüyor. Bu çözüm de satır sonları eklemediğiniz durumlarda da çalışabilir, ancak bu dizideki her yeni satır çıktı metinde bir satır sonu ima edeceğim. Daha önce benim javascript kaynak kodunda bu çözümü kullandım çünkü sadece nasıl göründüğünü ve nasıl son dizeye gireceği konusunda herhangi bir şüphe bırakmadığını sevdim.
Gal

JSON mucit rezervasyonları rağmen, ben sadece (javascript bölümü olmadan, ancak sadece [] ve virgül olmadan) yorum eklemek için kullandım küçük JSON dosyamı el-düzenlemek olabilir olası bir gelecekteki koruyucu yardımcı olmak için yorum eklemek için.
Whirl Mind

117

Maalesef buradaki cevapların çoğu, dize verilerine yeni satır karakterinin nasıl yerleştirileceği sorusunu ele almaktadır. Soru, dize değerini birden çok kod satırına bölerek kodun daha güzel görünmesini sağlamaktır. (Ve bunu tanıyan cevaplar bile, çoğu durumda olmayan veri sunumunu değiştirmekte özgür olduğunu kabul eden "çözümler" sağlar.)

Ve daha da kötüsü, iyi bir cevap yok.

Birçok programlama dilinde, dizeleri çizgiler arasında bölmeyi açıkça desteklemeseler bile, istenen efekti elde etmek için dize birleştirme özelliğini kullanabilirsiniz; ve derleyici korkunç olmadığı sürece bu iyi.

Ancak json bir programlama dili değildir; bu sadece bir veri temsilidir. Dizeleri birleştirmeyi söyleyemezsiniz. Ayrıca (oldukça küçük) dilbilgisi, bir dizeyi birden çok satırda temsil etmek için herhangi bir olanak içermez.

Bir tür ön işlemci tasarlamadan (ve birincisi, bu sorunu çözmek için kendi dilimi etkili bir şekilde yapmak istemiyorum), bu sorunun genel bir çözümü yoktur. Veri biçimini değiştirebiliyorsanız, bir dizi dizeyi değiştirebilirsiniz. Aksi takdirde, bu json'un insan tarafından okunabilirlik için tasarlanmadığı sayısız yoldan biridir.


3
OP'nin ne istediğini, dizedeki yeni satırları veya dizeyi daha iyi düzenleyeceği
belli değil

3
@ 9ilsdx9rvj0lo: Hayır, değil.
Mark Adelsberger

"Soru, dize değerini birden çok kod satırına bölerek kodun nasıl daha güzel görüneceğidir ..." ile ilgili: Python'daki çok satırlı ifadelere bir çözüm için bkz. Stackoverflow.com/questions/53162/… . Çok satırlı JSON ve çok satırlı Python arasında bir fark vardır. Çok satırlı JSON, JSON'da '\' ve ardından 'n', yani dizede "\ n" kullanır. Çok satırlı Python deyimleri için, '\' ve ardından '\ n' kullanın, yani devam edilecek satırın sonundaki ters eğik çizgi. Windows formatı: \ n yerine \ r \ n yazın!
Ivan

106

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

  • herhangi bir-Unicode-karakteri-dışında- "veya -veya- \veya kontrol-karakteri
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u Dört-heks-basamaklı

Yeni satırlar "kontrol karakterleri" dir, dolayısıyla hayır, dizenizde gerçek bir satırsonu olmayabilir. Ancak ne olursa olsun kombinasyonunu kullanarak kodlamak olabilir \nve \rsiz gerektirir.



3
Belirsizlik bırakmadığından doğru cevap budur. Yeni hatlar vardır kadar uzun düzgün kontrol karakteri ile kaçan gibi, şartname başına, izin verdi.
Ryan

JSON'daki @AliKhaki \ n, soru tarafından istenen sonucu başaramayacak. Ya başka bir şey düşünüyorsunuz (yani satırsonu karakterleri gömmek) ya da bir programlama dilinde (JSON içeren) yeni bir satırdan bahsediyorsunuz, ki bu yine farklı bir şey.
Orbit'te Hafiflik Yarışları

@LightnessRacesinOrbit evet i string içinde yeni satır arıyorum
Ali Khaki

46

JSON okunabilirlik için kesme çizgilerine izin vermez.

En iyi seçeneğiniz, sizin için satır çizecek bir IDE kullanmaktır.


1
"Yumuşak" satır sarmayı destekleyen BBEdit gibi bir editör idealdir. Metni, tümü düzenleyici penceresinin görünür alanında görünecek şekilde sarar, ancak yalnızca yazdığınız satır sonları (örneğin, satır başını vurmak) kaydedildiğinde dosyada kalmaya devam eder. Kod hileleri veya kesmek için başvurmak zorunda kalmadan JSON'u gerçekten uzun dizelerle düzenlemeyi kolaylaştırır.
cshotton

44

Bu gerçekten eski bir soru, ama bunu bir aramada buldum ve sanırım probleminizin kaynağını biliyorum.

JSON, verilerinde "gerçek" yeni satırlara izin vermez; yalnızca yeni satırlardan kaçmış olabilir. Bkz cevabı dan @YOU . Soruya göre, Python'daki satır sonlarından iki şekilde kaçmaya çalıştığınız anlaşılıyor: satır devam karakterini ("\" ) kullanarak veya "\n"kaçış olarak.

Ancak unutmayın: python'da bir dize kullanıyorsanız, özel çıkış karakterleri ( "\t", "\n") GERÇEK kontrol karakterlerine çevrilir! "\n" yerine, yeni satır karakterini temsil eden ASCII kontrol karakteri getirilir; bu, tam olarak JSON'da yasa dışı olan karakterdir. (Satır devam karakterine gelince, yeni satırı çıkarır.)

Yapmanız gereken Python'un karakterlerden kaçmasını önlemek. Bunu ham bir dize kullanarak ( rolduğu gibi dizenin önüne koyun r"abc\ndef"veya satırsonunun önüne fazla eğik çizgi ekleyerek "abc\\ndef") yapabilirsiniz.

Yukarıdakilerin her ikisi de, "\n"gerçek yeni satır ASCII kontrol karakteriyle değiştirmek yerine, "\n"iki gerçek karakter olarak bırakılacak ve daha sonra JSON yeni satır kaçışı olarak yorumlayabilecektir.


12

Özellik değerini bir dizeler dizisi olarak yazın. Burada verilen örnek gibi https://gun.io/blog/multi-line-strings-in-json/ . Bu yardımcı olacak.

Aşağıdaki gibi çok satırlı dizeler için her zaman dize dizisini kullanabiliriz.

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

Ve içeriği çok satırlı bir şekilde görüntülemek için diziyi kolayca tekrarlayabiliriz.


1
Cevabınızdaki bilgiyi linkten eklemenizi öneririm, Çünkü linkler gelecekte kırılabilir.
YoungHobbit

5
Ama onlara bir dizi var, bir dize değil. Dizi bir dize değildir. Dönemi.
9ilsdx 9rvj 0lo

Sadece bunu düşünüyordum. Güzel!
Phillip Jacobs

12

Https://json5.org/ - örnek (json5 tarafından ) için bkz.

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

OP'nin sorduğu soru. En azından json5 kullanabiliyorsa.
nomen

10

JSON'da çok satırlı dizeler olması mümkün müdür?

Evet. Bunu şimdi Firefox web tarayıcımla F12 tuşuna basıp konsola tıklayıp ekranın altına yazarak test ettim.

x={text:"hello\nworld"}

Nesne x, çok satırlı bir dize içeren bir JSON biçimi dizesinden yeni oluşturuldu.

console.log(x.text)
hello
world

Çok satırlı bir dize olduğunu gösteren x.text görüntülenir.

Bu iki test, Firefox'un Javascript yorumlayıcısının çok satırlı dizelerle JSON oluşturmaktan ve kullanmaktan mutluluk duyduğunu göstermektedir.

Javascript yorumlayıcısıyla yapılan daha fazla test JSON.stringifyve JSON.parseçok satırlı dizeler içeren bir nesneyi JSON'a dönüştürebilir ve sorun olmadan tekrar ayrıştırabilirsiniz.

Geçmişte Shakespeare'in tüm eserlerini bir JSON nesnesinde bir özellik olarak sakladım ve sonra internet üzerinden gönderdim, bozulmamış.

Misal

İşte üç satır üzerinden girilen iki satır dizesi

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

Nesneyi gösterebiliriz

console.log(x)

vererek

Object { text: "experts\nexchange" }

veya dize

console.log(x.text)

vererek

experts
exchange

Dizedeki satırların sonu \ n kullanıldığında ortaya çıkar ve çoklu giriş satırları satırın sonunda sadece \ kullanılarak elde edilir.

Pratikte, satır sonlarınızı dizede bulunanlarla senkronize etmek isteyebilirsiniz, ör.

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

Çok Satırlı Dize Uzunluğu

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

Yeni satıra sahip dizenin, boşluk içeren dizeden daha uzun olmadığını unutmayın. Klavyede iki karakter ('\' ve 'n') yazılmış olsa da, dizede yalnızca bir karakter saklanır.


3
Bir JavaScript dize biçimi okuyucu bir JSON dize biçimi okuyucu değildir ve bunun tersi de geçerlidir, bu nedenle çalışırken JavaScript konsolu da kabul eder x={"a":NaN}ve x={"a":"a \<literal newline with SHIFT>b"}bunlar JSON değildir, ancak JavaScript
cat

9

Kullanım tüm tekrarlarını değiştirmek için regex \r\nile \\n.

Bu benim için skalada çalıştı.

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

Neden 3 ters eğik çizgi?
neXus

6
@neXus Neden bilmiyorum ama biri 3 ters eğik çizgi üzerinde düzenledi. Düzeltdiği için LightnessRacesInOrbit'e teşekkürler.
Sikander

5

Node.js'yi kullanmak istiyorsanız, bunu yapabilirsiniz:

module.exports = {

  multilineStr: `

     dis my life 
     it's now or never

  `

}

Node.js ile içe aktarabilir ve kolayca JSON'a dönüştürebilirsiniz:

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

ve elde edersiniz:

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

nasıl çalışır : Node.js tarafından kolayca JSON dizgesi oluşturulabilen bir JS nesnesi oluşturan bir JS modülü yüklemek için Node.js'yi kullanırsınız. -E seçeneği, dizeyi değerlendirir ve -pseçenek, son Node.js işleminin döndürme sonucunu stdout'a yansıtır.

Farklı bir çalışma dizininde bulunan bir .js komut dosyasını yüklemek istiyorsanız, "" ve '' dizelerini değiştirmeniz gerekir:

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

-4

base64Kodlanmış dize değerini kullanmayı deneyin . Çoğu zaman benim için çalıştı.

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

base64kodlanmış dizeden sonra

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

base64 kodlama ve kod çözme tüm dillerde mevcuttur.


7
Görüntülemek için özel bir koda ihtiyacınız var, bir dizeyi bir diziye dönüştürüyorsunuz. Bu bir çözüm değil
tom10271

3
Bu kötü bir fikir olduğunu düşünüyorum - gereksiz yere içeriği engeller ve üretmek ve tüketmek için ekstra kod, zaman, bellek ve araçlar gerektirir. Dizede tarama yapmak ve özel karakterleri değiştirmek elbette ekstra kod, zaman ve bellek gerektirir, ancak kesinlikle base64 kodlama ve kod çözme
işleminden

Bu kötü bir fikir çünkü JSON'un okunabilirliği gitti ve ayrıca @ tom10271'in de belirttiği gibi, json'u kullanmak için ekstra işlem yapmanız gerekiyor
T90

-23

çok satırlı metni txt dosyasına koyun ve ardından

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

(mongoDB'de çalışır)


11
-1: bu yanıltıcı bir cevap. Geçerli bir JSON değildir ve adında bir işlev olmadığından javascript'te çalışmaz cat.
Martin Schuhfuß
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.