2010-03-06 1454 views
359

我正在寫一些JSON格式的數據文件,並希望將一些非常長的字符串值分割成多行。使用python的JSON模塊,我得到了很多錯誤,無論是使用\還是\n作爲轉義。JSON中的多行字符串

是否有可能在JSON中有多行字符串?這主要是爲了視覺上的舒適,所以我想我可以在我的編輯器中打開單詞換行,但我只是有點好奇...

+1

的[?如何處理換行符JSON(可能的複製https://stackoverflow.com/questions/42068/how-do-i-handle-newlines-in-json) – Flimzy 2017-08-13 09:25:13

回答

227

JSON不允許真正的換行符。您需要將所有換行符替換爲\n

+55

-1 OP *是*使用「\ n」轉義序列。它不工作,因爲它們沒有*反斜槓*,因爲「\\ n」,所以Python正在將轉義序列轉換爲換行符,而不是像JSON所要求的那樣將其作爲字面上的反斜槓和後面的en。 – user359996 2013-01-30 21:57:43

+4

@ user359996我不確定這是真的。對我來說(只用'\ n'將數據存儲在JSON中並通過Curses輸出),'\ n'似乎工作正常。它看起來取決於視圖/渲染引擎。 – ashes999 2014-03-07 14:28:53

+2

換行符確實是平臺特定的(參見http://en.wikipedia.org/wiki/Newline#Representations)。但是,每個@Lightness在Orbit的答案中進行比賽時,JSON語法中都不包含遊標返回或換行符。我實際上不是一個Python程序員,所以我不確定你的情況如何,但是你的解析器壞了,或者你沒有通過你認爲自己的東西。也許這個答案更好地解釋它:http://stackoverflow.com/a/9295597/359996。特別注意關於雙重逃脫的位。 – user359996 2014-03-07 17:28:25

145

我不得不對小Node.js的項目做到這一點,發現這個變通

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

], 
} 

這看起來相當整潔對我來說,從APPART,我要到處使用雙引號。儘管如此,我也許可以使用YAML,但這有其他缺陷,並且本機不支持。一旦解析,我只使用myData.modify_head.join('\n')myData.modify_head.join(),這取決於我是否想要在每個字符串之後換行。

+17

這是針對特定設置的解決方案,不一定與問題相關。你在那裏創建的不是多行字符串(這是不可能的),但是在 – 2015-06-12 13:04:03

+2

之內的字符串的數組這裏顯示瞭如何在字符串中插入換行符,這不會回答問題。 [這個答案](https://stackoverflow.com/a/27256893/903600)呢。 – fgrieu 2015-07-16 07:20:57

+1

fgrieu - 人們可以輕鬆地串聯字符串而不添加換行符。通過這種小改動,它可以爲多行字符串提供解決方法(只要您能夠控制指定JSON模式)。我會盡力改進這個答案。 – drrob 2015-10-15 10:56:06

31

這是一個非常古老的問題,但我在搜索中發現了這個問題,我想我知道你的問題的根源。

JSON不允許其數據中包含「真實」換行符;它只能逃脫換行符。請參閱上文@YOU的答案。根據這個問題,它看起來像你試圖用兩種方法逃避Python中的換行符:使用行連續符(「\」)或使用「\ n」作爲轉義符。但請注意:如果您在python中使用字符串,特殊轉義字符(「\ t」,「\ n」)會被轉換爲REAL控制字符! 「\ n」將替換爲表示換行符的ASCII控制字符,這正是JSON中非法的字符。 (至於續行字符,它只需要換行符。)

因此,您需要做的是防止Python轉義字符。您可以通過使用原始字符串做到這一點(把r在前面的字符串,如r"abc\ndef",或者通過在換行("abc\\ndef")的前一個額外的斜槓。

兩個以上的意志,而不是替換「\ n」使用真正的換行符ASCII控制字符,會將「\ n」作爲兩個文字字符,然後JSON可以解釋爲新行轉義字符

70

檢出the specification!該JSON語法的焦炭生產可以採取以下值:

  • 任何Unicode的字符,但以下情況除外" - 或 - \ -or控制字符
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u四十六進制數字

換行 「控制字符」,所以,不,你可能不會內有面值換行符你的字符串。但是,您可以使用您需要的任何組合\n\r對其進行編碼。

+0

現在它ECMA-404))http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf – gavenkoa 2017-03-20 09:06:40

+1

這是正確的答案,因爲它沒有模棱兩可。根據規範,只要允許用控制字符正確轉義,新行*就是允許的。 – Ryan 2017-03-23 18:19:06

-14

把多行文本上的txt文件,然後

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

(它的工作對MongoDB的)

+4

-1:這是一個誤導性的答案。它既不是有效的JSON,也不是在JavaScript中工作,因爲沒有名爲'cat'的函數。 – 2015-12-16 17:41:36

8

使用正則表達式與\\n取代的\r\n所有出現。

這在scala中適用於我。

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

爲什麼3個反斜槓? – neXus 2015-07-13 09:32:25

+3

@neXus我不知道爲什麼,但有人編輯它到3個反斜槓。感謝LightnessRacesInOrbit來糾正它。 – Sikander 2015-12-17 08:19:29

22

JSON不允許斷行以提高可讀性。

最好的辦法就是使用一個可以爲您換行的IDE。

+0

像BBEdit這樣的支持「軟」換行的編輯器是理想選擇。它將文本包裝起來,使其全部出現在編輯器窗口的可見區域內,但只有您鍵入的行結束符(例如,回車符)纔會保存在文件中。使用真正的長字符串編輯JSON變得更容易,而不必訴諸於代碼技巧或黑客行爲。 – cshotton 2017-08-18 13:05:31

-17

你可以嘗試在句子之間試試<div></div>

+1

這可能會更嚴重嗎? :D – 2017-04-27 15:31:43

+4

需要更多的jQuery。 – undefined 2017-07-03 21:51:12

+0

希望2 upvotes是爲了開玩笑 – 2018-01-26 13:10:54

-8

寫在記事本中的任何文字++多的多線 然後按CTL +和CTL + J將它們在同一行安排

在JSON文件的寫:

​​
+0

這似乎已經完全刪除了所有換行符!也許提到如何用Notepad ++中的/ n替代硬換行符在這裏會更有用。 – Bernard 2016-04-19 02:03:32

11

寫屬性值作爲字符串數組。就像這裏給出的例子https://gun.io/blog/multi-line-strings-in-json/。這將有所幫助。

我們總是可以對多行​​字符串使用如下所示的字符串數組。

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

而且我們可以很容易地迭代數組來顯示多線時尚的內容。

+0

我建議你在鏈接的答案中加入信息,因爲鏈接將來可能會中斷。 – YoungHobbit 2015-10-07 10:40:12

-5
fieldval = rs.getString(rs.getMetaData().getColumnName(i)) 
    .trim() 
    .replace("\\", "/") 
    .replace("\r\n", "\\n") 
    .replace("''", "\\n") 
    .replace("\"", "\\n"); 
+10

有些解釋會提高答案的質量。 – m02ph3u5 2016-03-08 11:06:45

-3

{{名稱}}
{{NAME1}}

my.opt.push({ '名稱': '行1', 'NAME1': 'LINE2')

+0

我給出
標籤名稱和名稱之間的關係1 – 2017-07-08 21:42:02

3

是否有可能在JSON中有多行字符串?

是的。我只需通過按F12,單擊控制檯並在屏幕底部鍵入,即可用我的Firefox Web瀏覽器對其進行測試。

x={text:"hello\nworld"} 

對象x剛剛從包含多行字符串的JSON格式字符串創建。

console.log(x.text) 
hello 
world 

顯示x.text表明它是一個多行字符串。

這兩個測試顯示Firefox的Javascript解釋器很樂意創建和使用帶有多行字符串的JSON。

更多與JSON.stringifyJSON.parse的測試顯示,Javascript解釋器可以將包含多行字符串的對象轉換爲JSON並將其解析回來,而沒有任何問題。

我過去曾將莎士比亞的全部作品存儲爲JSON對象中的一個屬性,然後通過互聯網將其發送至未損壞的作品。

下面是輸入超過三行

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

我們可以顯示對象

console.log(x) 

給予

Object { text: "experts\nexchange" } 

或串的兩行字符串

console.log(x.text) 

使用\ n 和多條輸入線,僅使用取得了\在該行的末尾給出

experts 
exchange 

在字符串結果線的端部。

實際上,您可能希望將您的行結束符與字符串中的行結束符同步,例如,

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

多行字符串長度

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

注意與換行符字符串不是比用空間的字符串長。即使鍵盤上鍵入了兩個字符('\'和'n'),字符串中只會存儲一個字符。

1

總結各線進入引號和逗號與結束它們,如下圖所示:

"content": [ 
    "This is the first line", 
    "this is second", 
    "and so on" 
] 
+2

這是一個包含三個字符串的數組,而不是一個分成三行的字符串。 – tripleee 2017-12-04 13:41:52

+0

@tripleee這是一種非常普遍的做法。甚至VSCode也是這樣做的。檢查他們的用戶代碼片段。 – 2017-12-04 17:30:42

+1

這可能是,但這不是一個多行字符串,因此不是真正的這個問題的答案。 – tripleee 2017-12-04 17:54:35

2

不是一個JSON的答案,但對人打交道,在CoffeeScript中「類JSON」數據替代。

CSON(ç奧菲小號 CRIPT ö bject Ñ浮選)本身處理多行字符串:

singleline: 'single line' 
multiline: ''' 
    line one 
    line two 
    line three 
    ''' 

原件存放可在https://github.com/bevry/cson

0

,你可以簡單地用你的慾望多串運行下面的代碼波浪之間~字符:

var multiLineString = ` 
this 
    is 
     the 
      multiline 
        String 

`; 
JSON.stringify(multiLineString); 
+0

這並不回答這個問題。放在墳墓(')字符之間的字符是ES6模板文字,其主要焦點是用於模板化字符串,而不是用於支持此格式的多行文本。 儘管您可以在技術上使用它們(如此處所示),但所有結果都是格式如下的字符串: '「」\ n本\ n是\ n多行\ n字符串\ n \ n「」' 哪個不是有效的JSON,並且不回答OP的問題。上面的其他答案更好地解決了這個問題。 – TuxToaster 2018-02-27 03:56:05