JSON中允许多行字符串吗?

在JSON中可以有多行字符串吗?

这主要是为了视觉舒适,所以我想我可以在我的编辑器中打开文字包装,但我只是有点好奇。

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

1080304 次浏览

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

eg:

"第一行第二行“

可以保存:

"first line\nsecond line"

备注:

对于Python,这应该写成:

"first line\\nsecond line"

其中\\用于转义反斜杠,否则python会将\n视为控制字符“新行”

我不得不为一个小型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>" 
],}

解析后,我只使用myData.modify_head.join('\n')myData.modify_head.join(),这取决于我是否希望在每个字符串之后使用换行符。

这对我来说看起来很整洁,除此之外,我必须在任何地方使用双引号。尽管否则,我也许可以使用YAML,但这有其他缺陷,并且不受本地支持。

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

JSON在其数据中不允许“真正”的换行符;它只能有转义的换行符。参见@你中的回答。根据问题,看起来你试图通过两种方式转义Python中的换行符:使用行延续字符("\")或使用"\n"作为转义。

但请记住:如果您在python中使用字符串,特殊转义字符("\t""\n")将被转换为真正的控制字符!"\n"将被替换为表示换行符的ASCII控制字符,这正是JSON中非法的字符。(至于行继续字符,它只是将换行符去掉。)

因此,您需要做的是防止Python转义字符。您可以通过使用原始字符串来做到这一点(将r放在字符串前面,如r"abc\ndef"所示,或者在换行符前面包含一个额外的斜杠("abc\\ndef")。

上述两个都不会用真正的换行符ASCII控制字符替换"\n",而是将"\n"保留为两个文字字符,然后JSON可以将其解释为换行符转义。

看看的规范!JSON语法的char生产可以采用以下值:

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

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

JSON不允许断行以实现易读性。

您最好的选择是使用一个IDE,它将为您换行。

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

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

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

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

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

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

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

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

除了设计某种预处理器(就我而言,我不想有效地组成自己的语言来解决这个问题)之外,这个问题没有通用的解决方案。如果你可以更改数据格式,那么你可以替换字符串数组。否则,这是json不是为人类易读性设计的众多方式之一。

虽然不是标准的,但我发现一些JSON库有支持多行字符串的选项。我说这话时要注意,这会损害你的互操作性。

但是在我遇到的特定场景中,我需要制作一个仅供一个系统使用的配置文件,供人类读取和管理。并最终选择了这个解决方案。

这是在杰克逊的Java上的工作原理:

JsonMapper mapper = JsonMapper.builder().enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS).build()

您可以在客户端编码,在服务器端解码。这也将处理\n和\t字符

例如,我需要通过json发送多行xml

{"xml": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CiAgPFN0cnVjdHVyZXM+CiAgICAgICA8aW5wdXRzPgogICAgICAgICAgICAgICAjIFRoaXMgcHJvZ3JhbSBhZGRzIHR3byBudW1iZXJzCgogICAgICAgICAgICAgICBudW0xID0gMS41CiAgICAgICAgICAgICAgIG51bTIgPSA2LjMKCiAgICAgICAgICAgICAgICMgQWRkIHR3byBudW1iZXJzCiAgICAgICAgICAgICAgIHN1bSA9IG51bTEgKyBudW0yCgogICAgICAgICAgICAgICAjIERpc3BsYXkgdGhlIHN1bQogICAgICAgICAgICAgICBwcmludCgnVGhlIHN1bSBvZiB7MH0gYW5kIHsxfSBpcyB7Mn0nLmZvcm1hdChudW0xLCBudW0yLCBzdW0pKQogICAgICAgPC9pbnB1dHM+CiAgPC9TdHJ1Y3R1cmVzPg=="}

然后在服务器端解码

public class XMLInput{public string xml { get; set; }public string DecodeBase64(){var valueBytes = System.Convert.FromBase64String(this.xml);return Encoding.UTF8.GetString(valueBytes);}}
public async Task<string> PublishXMLAsync([FromBody] XMLInput xmlInput){string data = xmlInput.DecodeBase64();}

一旦解码,您将获得原始xml

<?xml version="1.0" encoding="utf-8" ?><Structures><inputs># This program adds two numbers
num1 = 1.5num2 = 6.3
# Add two numberssum = num1 + num2
# Display the sumprint('The sum of {0} and {1} is {2}'.format(num1, num2, sum))</inputs></Structures>

如果它只是为了在编辑器中呈现,您可以使用'而不是'或'

const obj = {myMultiLineString: `This is written in a \multiline way. \The backside of it is that you \can't use indentation on every new \line because is would be included in \your string. \The backslash after each line escapes the carriage return.`}

示例:

console.log(`First line \Second line`);

将放在控制台:
第一行第二行

console.log(`First linesecond line`);

将放在控制台:
第一行
第二行

希望这回答了你的问题。

\n\r\n为我工作!

\n为单行断开,\n\r\n为双行断开