2010-03-06 1428 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