JSON中的多行字符串

Ano*_*ody 584 string syntax json multiline

我正在用JSON格式编写一些数据文件,并希望将一些非常长的字符串值分成多行.使用python的JSON模块我得到了很多错误,无论是使用\还是\n作为转义.

是否可以在JSON中使用多行字符串?这主要是为了视觉上的舒适,所以我想我可以在我的编辑器中翻开自动换行,但我只是有点好奇......

YOU*_*YOU 372

JSON不允许真正的换行符.您需要替换所有换行符\n.

例如:

"first line second line"

可以保存:

"first line\nsecond line"

注意:

因为Python,这应写成:

"first line\\nsecond line"

在哪里\\用于转义反斜杠,否则python会将\n控件作为"新行"

  • -1 OP*是*使用"\n"转义序列.它不起作用,因为它们没有*转义反斜杠*,因为"\\n",所以Python正在将转义序列转换为换行符,而不是像JSON所要求的那样将它保留为字面上的反斜杠后跟en. (82认同)
  • OP 不想_表示_新行,而是要在多个源行上格式化一个逻辑 JSON 行。他确实因为谈论\n而把水搅浑了。他想要我们过去所说的“延续线”https://pages.mtu.edu/~shene/COURSES/cs201/NOTES/chap01/continue.html。 (12认同)
  • 没有回答问题。 (11认同)
  • @ user359996我不确定这是真的.对我来说(用JZ存储数据只用`\n`并通过Curses输出),`\n`似乎工作正常.它似乎取决于视图/渲染引擎. (5认同)
  • @Nawaz:"\n"和"\ r"分别是换行和回车的*转义序列*.它们不是文字换行和回车控制*字符*.作为使其更清晰的另一个例子,考虑"\\"是反斜杠的*转义序列*,而不是文字反斜杠.JSON语法明确地排除了控制字符(参见"char"定义),而是通过转义序列(\\,\ r,\n等)提供它们的表示. (5认同)
  • 换行序列确实是特定于平台的(参见http://en.wikipedia.org/wiki/Newline#Representations).但是,根据Orbit的答案中的@Lightness Races,游标返回和换行符都不在JSON语法中.我实际上不是一个Python程序员,所以我不确定你的情况会发生什么,但要么你的解析器坏了,要么你没有按照你的想法传递它.也许这个答案更好地解释了它:http://stackoverflow.com/a/9295597/359996.请特别注意关于双重转义的内容. (2认同)
  • @ user359996:是的......我后来看到了,虽然我保留了我的旧评论,如果有人提出同样的疑问,我们的讨论可能会对他们有所帮助.谢谢你确认BTW. (2认同)

err*_*per 191

我必须为一个小的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>"

 ],
}
Run Code Online (Sandbox Code Playgroud)

这对我来说看起来很整洁,因为我必须到处使用双引号.虽然不然,但我可能会使用YAML,但这有其他陷阱而且本身不支持.一旦解析,我只是使用myData.modify_head.join('\n')myData.modify_head.join(),取决于我是否想要在每个字符串之后换行.

  • 这是针对特定设置的解决方案,不一定与问题相关.你在那里创建的不是多行字符串(无论如何都不可能),但是里面有字符串的数组 (35认同)
  • 这显示了如何在字符串中插入换行符,但不回答问题.[这个答案](/sf/answers/1907982541/). (3认同)
  • 谢谢,我喜欢这个。我将继续我正在做的事情。它看起来整洁有序。我将让该数组中的每个新行都意味着输出文本中的换行符,尽管此解决方案也适用于不插入换行符的情况。我之前在我的 javascript 源代码中使用过这个解决方案,只是因为我喜欢它的组织方式,以及它不会对最终字符串中的空白类型留下任何疑问。 (2认同)

Lig*_*ica 101

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

  • any-Unicode-character-except- "-or- \-or-control-character
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u 四十六进制数字

换行符是"控制字符",所以不,你的字符串中可能没有文字换行符.然而,你可以使用任何的组合进行编码,\n并且\r您需要.

  • 没有。这并不能回答问题。问题不在于如何将换行符放入字符串中。问题是如何将字符串分布在多行上。正确答案是:不可能。 (6认同)
  • JSON 中的 @AliKhaki \n 将无法实现问题所寻求的结果。要么您正在考虑其他内容(即嵌入换行符),要么您正在谈论某种编程语言中字符串文字(包含 JSON)中的换行符,这又是不同的东西。 (4认同)
  • 这是正确的答案,因为它没有歧义。根据规范,*允许*换行,只要可以使用控制字符正确地对它们进行转义即可。 (3认同)

Mar*_*ger 67

不幸的是,这里的许多答案都解决了如何在字符串数据中添加换行符的问题.问题是如何通过在多行代码中分割字符串值来使代码看起来更好.(甚至认识到这一点的答案也提供了"解决方案",假设一个人可以自由地改变数据表示,在许多情况下,人们不会这样做.)

更糟糕的是,没有好的答案.

在许多编程语言中,即使它们没有明确支持跨行分割字符串,您仍然可以使用字符串连接来获得所需的效果; 只要编译器不是很糟糕,这很好.

但是json不是一种编程语言; 它只是一个数据表示.你不能告诉它连接字符串.它的(相当小的)语法也不包括用于在多行上表示字符串的任何工具.

没有设计某种类型的预处理器(而且,对于其中一种,我觉得不能有效地编写我自己的语言来解决这个问题),这个问题没有一般解决方案.如果您可以更改数据格式,则可以替换字符串数组.否则,这是json不是为人类可读性而设计的众多方法之一.

  • 有时我觉得JSON格式设计得不够彻底。没有注释,没有多行支持。我理解它只是一种数据格式,但“供人类使用”。所以一些“人性化”的功能会很有帮助。 (23认同)
  • OP 的要求非常清楚,这就是正确的答案。 (20认同)
  • 杰出的。这就是我一直在寻找的答案,而且,提醒 json 不是一种语言有助于在上下文中解决问题。 (4认同)
  • 尚不清楚OP想要什么,以字符串换行或更好地组织字符串... (2认同)
  • @ 9ilsdx9rvj0lo:不,不是。 (2认同)
  • 这是OP真正想要的正确答案,我也是,即使结果听起来对JSON格式化程序不是很满意...... (2认同)
  • @9ilsdx9rvj0lo OP问题中的内容_我正在以JSON格式编写一些数据文件,并且希望将一些非常长的字符串值拆分为多行。_不清楚他想要更好地组织字符串吗?这是完全清楚易懂的。 (2认同)

Jam*_*tes 40

JSON不允许断行以提高可读性.

最好的办法是使用一个可以为你换行的IDE.

  • 像 BBEdit 这样支持“软”换行的编辑器是理想的选择。它对文本进行换行,使其全部显示在编辑器窗口的可见区域内,但在保存文件时,只有您键入的行结尾(例如,按回车符)会保留在文件中。可以更轻松地编辑具有很长字符串的 JSON,而无需诉诸代码技巧或 hack。 (3认同)
  • 无论 JSON 是否旨在成为人类可读的(在这种情况下,我会同意关于糟糕设计的评论),事实是它为“传输”数据提供了一种出色的格式(比 XML 更紧凑,但仍然易于专家阅读)。对于“读取”数据来说,它不是一个好的格式,而且由于上述限制,它对于写入配置尤其不利。例如,YAML 是一种专门为后一种情况设计的语言。 (3认同)
  • 有时我觉得JSON格式设计得不够彻底。没有注释,没有多行支持。我理解它只是一种数据格式,但“供人类使用”。所以一些“人性化”的功能会很有帮助。 (2认同)
  • 谢谢你的回答,这让我微笑。这实际上是唯一正确的答案,因为 JSON 标准在这里非常严格,因此很长的文本很难维护。为什么我自己没有想出这个简单的解决方案?:-) (2认同)

Har*_*wEm 39

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

JSON不允许在其数据中使用"真正的"换行符; 它只能逃脱换行.查看答案@YOU.根据这个问题,看起来你试图以两种方式逃避Python中的换行符:使用行继续符("\"或)"\n"作为转义.

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

所以你需要做的是防止Python转义字符.您可以通过使用原始字符串(放在字符串r前面,如在中r"abc\ndef",或在换行符前面包含一个额外的斜杠("abc\\ndef"))来完成此操作.

以上两种方法都不会替换"\n"为真正的换行符ASCII控制字符,而是留下"\n"两个文字字符,然后JSON可以将其解释为换行符.


Iva*_*van 13

是否可以在JSON中使用多行字符串?

是.我刚刚使用我的Firefox网络浏览器测试了这一点,按F12,点击控制台并在屏幕底部输入.

x={text:"hello\nworld"}
Run Code Online (Sandbox Code Playgroud)

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

console.log(x.text)
hello
world
Run Code Online (Sandbox Code Playgroud)

显示x.text,显示它是一个多行字符串.

这两个测试表明,Firefox的Javascript解释器很乐意使用多行字符串创建和使用JSON.

使用JSON.stringifyJSON.parse显示Javascript解释器的更多测试可以将包含多行字符串的对象转换为JSON并再次解析它而没有任何问题.

我过去将莎士比亚的全部作品存储为JSON对象中的属性,然后通过互联网发送,没有损坏.

这是通过三行输入的两行字符串

x={text:"expert\
s\nex\
change"}
Run Code Online (Sandbox Code Playgroud)

我们可以显示对象

console.log(x)
Run Code Online (Sandbox Code Playgroud)

Object { text: "experts\nexchange" }
Run Code Online (Sandbox Code Playgroud)

或者字符串

console.log(x.text)
Run Code Online (Sandbox Code Playgroud)

experts
exchange
Run Code Online (Sandbox Code Playgroud)

字符串中的行结束来自使用\n,并且在行的末尾仅使用\来实现多个输入行.

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

x={text:"experts\n\
exchange"}
Run Code Online (Sandbox Code Playgroud)

多行字符串长度

console.log("Hello\nWorld".length)
11 
console.log("Hello World".length)
11
Run Code Online (Sandbox Code Playgroud)

请注意,带换行符的字符串不长于带空格的字符串.即使键盘上键入了两个字符('\'和'n'),字符串中也只存储一个字符.


San*_*mal 12

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

我们总是可以为多行字符串使用字符串数组,如下所示.

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 
Run Code Online (Sandbox Code Playgroud)

我们可以轻松地迭代数组以多行方式显示内容.

  • 但是它们有一个数组,而不是字符串。数组不是字符串。期。 (4认同)
  • 我建议您在链接的答案中添加信息,因为链接将来可能会中断。 (2认同)

Sik*_*der 9

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

这在scala中对我有用.

val newstr = str.replace("\r\n", "\\n")
Run Code Online (Sandbox Code Playgroud)

  • @neXus我不知道为什么但是有人把它编辑成了3个反斜杠.感谢LightnessRacesInOrbit进行纠正. (6认同)

小智 7

使用json5(加载程序),请参阅https://json5.org/-示例(由json5)

{
  lineBreaks: "Look, Mom! \
No \\n's!",
}
Run Code Online (Sandbox Code Playgroud)


yos*_*y27 5

这是一个非常古老的问题,但当我想提高使用复杂条件表达式的 Vega JSON 规范代码的可读性时,我也遇到了同样的问题。代码是这样的。

正如这个答案所说,JSON 不是为人类设计的。我知道这是一个历史决定,对于数据交换目的来说是有意义的。然而,在这种情况下,JSON 仍然被用作源代码。所以我要求我们的工程师使用Hjson作为源代码,并将其处理为JSON。

例如,在Windows环境下的Git中,您可以下载Hjson cli二进制文件并将其放在git/bin目录中使用。然后,将 Hjson 源转换(转译)为 JSON。使用 Make 等自动化工具生成 JSON 将很有用。

$ which hjson
/c/Program Files/git/bin/hjson

$ cat example.hjson
{
  md:
    '''
    First line.
    Second line.
      This line is indented by two spaces.
    '''
}

$ hjson -j example.hjson > example.json

$ cat example.json
{
  "md": "First line.\nSecond line.\n  This line is indented by two spaces."
}
Run Code Online (Sandbox Code Playgroud)

如果在编程语言中使用转换后的 JSON,特定于语言的库(如hjson-js)将很有用。

我注意到在重复的问题中发布了相同的想法,但我会分享更多信息。