JSON中的多行字符串


655

我正在以JSON格式编写一些数据文件,并希望将一些很长的字符串值分成多行。使用python的JSON模块,无论使用\还是\n转义,我都会遇到很多错误。

JSON中是否可以包含多行字符串?主要是为了视觉舒适,所以我想我可以在编辑器中打开自动换行功能,但是我有点好奇……



1
结构化数据:将多行字符串分成字符串数组,然后再将它们连接起来。
RubyTuesdayDONO

2
尝试使用hjson工具。它将您的json中的多行字符串转换为正确的json格式。
gaurav

Answers:


401

JSON不允许使用实际的换行符。您需要将所有换行符替换为\n

例如:

"first line second line"

可以保存为:

"first line\nsecond line"

注意:

对于Python,应写为:

"first line\\nsecond line"

这里\\是逃离反斜杠,否则蟒蛇将把\n作为控制字符“新线”


88
-1 OP 正在使用“ \ n”转义序列。它不起作用是因为它们没有将反斜杠转义为“ \\ n”,因此Python会将转义序列转换为换行符,而不是像JSON要求的那样将其保留为反斜杠后跟一个en。
user359996

6
@ user359996我不确定这是真的。对我来说(用just存储JSON数据\n并通过Curses输出数据)\n似乎还可以。看来,这取决于视图/渲染引擎。
ashes999 2014年

2
换行序列确实是特定于平台的(请参阅en.wikipedia.org/wiki/Newline#Representations)。但是,根据Orbit答案中的@Lightness Races,JSON语法中既没有光标返回字符也没有换行字符。我实际上不是Python程序员,所以我不确定您的情况如何,但是解析器损坏了,或者您没有传递您认为的样子。也许这个答案可以更好地解释它:stackoverflow.com/a/9295597/359996。请特别注意有关两次转义的内容。
user359996 2014年

5
@Nawaz:“ \ n”和“ \ r”分别是换行和回车的转义序列。它们不是字面换行符和回车。为了使它更清楚,作为另一个示例,请考虑“ \\”是反斜杠的转义序列,而不是文字反斜杠。JSON语法明确排除了控制字符(请参阅“ char”定义),而是通过转义序列(\\,\ r,\ n等)提供它们的表示。
user359996 '16

2
@ user359996:是的。后来我看到了,尽管我保留了旧的评论,以防万一其他人也提出同样的疑问,我们的讨论可能会对他们有所帮助。谢谢确认BTW。
纳瓦兹

197

我不得不为一个小的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>"

 ],
}

这对我来说看起来很整洁,因为我必须在所有地方都使用双引号。尽管不是这样,我也许可以使用YAML,但这有其他陷阱,并且本机不支持。解析后,我只使用myData.modify_head.join('\n')myData.modify_head.join(),这取决于我是否要在每个字符串后换行。


40
这是针对特定设置的解决方案,不一定与问题相关。您创建的内容不是多行字符串(无论如何都是不可能的),而是其中包含字符串的数组
Samuel Rivas 2015年

3
这显示了如何在字符串中插入换行符,但不能回答问题。这个答案可以。
fgrieu

1
fgrieu-不用添加换行符就可以很容易地连接字符串。有了很小的改动,它确实为多行字符串提供了一种解决方法(只要您可以控制JSON模式的指定)。我将尝试以此改善答案。
drrob

1
谢谢,我喜欢这个。我正在为此工作。它看起来整洁有序。我将使该数组中的每一行都暗示输出文本中的换行符,尽管这种解决方案也可以在不插入换行符的情况下使用。我以前在javascript源代码中使用过该解决方案,只是因为我喜欢它的外观组织方式,以及对于最终字符串中的空白类型,它毫无疑问。
Gal 2015年

尽管有JSON发明者的保留,但我只是使用它来添加注释(不包括javascript部分,而仅包含[]和逗号)来添加注释,以帮助可能的将来的维护者来手工编辑我的小JSON文件。
Whirl Mind

116

不幸的是,这里的许多答案都解决了如何在字符串数据中放置换行符的问题。问题是如何通过将字符串值分成多行代码来使代码看起来更好。(甚至认识到这一点的答案也提供了“解决方案”,这些解决方案假定一个人可以自由更改数据表示形式,而在许多情况下则不能。)

更糟糕的消息是,没有好的答案。

在许多编程语言中,即使它们不显式支持跨行分割字符串,您仍然可以使用字符串串联来获得所需的效果;只要编译器不是很糟糕,就可以了。

但是json不是一种编程语言;这只是一个数据表示。您不能告诉它连接字符串。它的(相当小的)语法也不包含任何表示多行字符串的功能。

缺少设计某种预处理器的过程(而我,其中一个,我感觉自己无法有效地用自己的语言来解决这个问题),但是没有一个通用的解决方案。如果可以更改数据格式,则可以替换字符串数组。否则,这是json并非为人类可读性而设计的众多方式之一。


3
目前尚不清楚OP想要什么,以字符串换行还是更好地组织字符串...
9ilsdx 9rvj 0lo 18-10-31

3
@ 9ilsdx9rvj0lo:不,不是。
Mark Adelsberger '18

关于“问题是如何通过将字符串值分成多行代码来使代码看起来更好……”:有关Python中多行语句的解决方案,请参见stackoverflow.com/questions/53162/…。多行JSON和多行Python之间有区别。多行JSON在JSON中使用“ \”,后跟“ n”,即在字符串中使用“ \ n”。多行Python语句,使用“ \”后跟“ \ n”,即要继续的行上的尾部反斜杠。Windows格式:在适当的地方用\ r \ n替换\ n!
伊万

106

查看规格!JSON语法的char生成可以采用以下值:

  • 任何Unicode字符,除了"- \或- 或控制字符
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u 四十六进制数字

换行符是“控制字符”,因此,不,您的字符串中可能没有文字换行符。但是,您可以使用\n\r所需的任意组合对其进行编码。



3
这是正确的答案,因为它没有歧义。新线允许的,根据规范要求,只要他们正确地控制字符转义。
瑞安

JSON中的@AliKhaki \ n将无法完成问题所寻求的结果。您正在考虑其他事情(即嵌入换行符),或者您正在谈论某种编程语言中的字符串文字(包含JSON)中的换行符,这又有所不同。
Lightness Races in Orbit,

@LightnessRacesinOrbit是的,我正在寻找字符串中的换行符
Ali Khaki

46

JSON不允许换行以提高可读性。

最好的选择是使用可以自动换行的IDE。


1
像BBEdit这样的支持“软”换行的编辑器是理想的。它包装了文本,使其全部显示在编辑器窗口的可见区域中,但是保存时,只有您键入的行尾(例如,按回车键)会保留在文件中。使使用很长的字符串编辑JSON变得更容易,而不必诉诸代码技巧或黑客。
cshotton

44

这是一个非常老的问题,但我在搜索中遇到了这个问题,我想我知道您问题的根源。

JSON不允许在其数据中使用“真实”换行符;它只能逃脱换行符。查看答案@YOU。根据问题,您似乎试图通过两种方式对换行符进行转义:通过使用换行符("\")或将其"\n"用作转义符。

但请记住:如果您在python中使用字符串"\t""\n"则会将特殊的转义字符(,)转换为REAL控制字符!该"\n"会代表一个换行符,而这恰恰是在JSON非法字符的ASCII控制字符替换。(关于换行符,它只是将换行符取出。)

因此,您需要做的是防止Python转义字符。您可以通过使用原始字符串(例如r,在字符串前面放置r"abc\ndef",或在换行符("abc\\ndef")之前添加一个额外的斜杠)来实现此目的。

以上两种方法都"\n"将保留"\n"两个文字字符,而JSON可以将其解释为换行符转义,而不是用实际的换行符ASCII控制字符代替。


12

将属性值写为字符串数组。就像这里给出的示例https://gun.io/blog/multi-line-strings-in-json/。这会有所帮助。

我们总是可以将字符串数组用于多行字符串,如下所示。

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

而且,我们可以轻松地迭代数组以多行方式显示内容。


1
我建议您从链接中添加答案中的信息,因为链接将来可能会中断。
YoungHobbit

5
但是它们有一个数组,而不是字符串。数组不是字符串。期。
9ilsdx 9rvj 0lo

只是在想这个。真好!
菲利普·雅各布斯


10

JSON中是否可以包含多行字符串?

是。我现在使用Firefox Web浏览器进行了测试,方法是按F12,单击控制台,然后在屏幕底部键入内容。

x={text:"hello\nworld"}

刚刚从包含多行字符串的JSON格式字符串创建了对象x。

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)

给予

experts
exchange

字符串中的行尾是使用\ n生成的,而多行输入仅在行尾使用\即可实现。

实际上,您可能希望将行尾与字符串中的行尾同步,例如

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

多行字符串长度

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

请注意,带有换行符的字符串不得超过带有空格的字符串。即使在键盘上键入了两个字符(“ \”和“ n”),字符串中也只存储了一个字符。


3
一个JavaScript字符串格式的读者是不是一个JSON字符串格式文件阅读器,反之亦然,因此,尽管它发生在工作中,JavaScript控制台也接受 x={"a":NaN}x={"a":"a \<literal newline with SHIFT>b"},这是不是JSON,但JavaScript的

9

使用表达式替换所有出现的\r\n\\n

这在scala对我有用。

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

为什么3个反斜杠?
neXus

6
@neXus我不知道为什么,但是有人将其编辑为3个反斜杠。感谢LightnessRacesInOrbit对其进行更正。
西坎德(Sikander)2015年

5

如果您愿意使用Node.js,可以执行以下操作:

module.exports = {

  multilineStr: `

     dis my life 
     it's now or never

  `

}

您可以使用Node.js导入并将其轻松转换为JSON,如下所示:

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

你会得到:

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

工作原理:您可以使用Node.js加载JS模块,该模块会创建一个JS对象,该对象可以通过Node.js轻松地进行JSON字符串化。-e选项计算字符串,该-p选项将上一个Node.js操作的返回结果回显到stdout。

如果要加载位于不同工作目录中的.js脚本,则必须切换“”和“”字符串:

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

-4

尝试使用base64编码的字符串值。大多数时候为我工作。

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

base64编码后的字符串看起来像

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

base64编码和解码支持所有语言。


7
您需要特殊的代码来显示它,您正在将字符串转换为数组。这不是解决方案
tom10271 '18

3
我认为这是一个坏主意-它会不必要地混淆内容,并且需要额外的代码,时间,内存和工具来产生和使用它。扫描字符串并替换特殊字符当然也需要额外的代码,时间和内存,但绝对少于base64编码和解码
Semanino

这是个坏主意,因为JSON的可读性已消失,而且就像提到的@ tom10271一样,您需要额外的操作才能使用json
T90

-23

将多行文字放在txt文件上,然后

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

(它的工作在mongoDB上)


11
-1:这是一个误导性的答案。它既不是有效的JSON,也不能在javascript中使用,因为没有名为的函数cat
MartinSchuhfuß2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.