880

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

这主要是为了视觉舒适,所以我想我可以在我的编辑器中打开自动换行,但我只是有点好奇。

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

4

11 回答 11

538

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

例如:

"first line second line"

可以保存:

"first line\nsecond line"

笔记:

对于Python,这应该写成:

"first line\\nsecond line"

where\\用于转义反斜杠,否则 python 将\n视为控制字符“换行符”

于 2010-03-06T15:04:26.923 回答
305

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

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

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

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

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

于 2018-09-28T14:35:03.333 回答
230

我不得不为一个小型 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')or myData.modify_head.join(),这取决于我是否想要在每个字符串之后换行。

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

于 2011-10-12T18:21:48.133 回答
126

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

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

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

于 2013-05-22T11:10:18.573 回答
74

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

你最好的选择是使用一个可以为你换行的 IDE。

于 2014-12-02T18:58:27.177 回答
51

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

JSON 不允许在其数据中使用“真正的”换行符;它只能逃脱换行符。请参阅@YOU答案。根据问题,您似乎试图以两种方式在 Python 中转义换行符:使用续行符 ( ) 或用作转义符。"\""\n"

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

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

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

于 2013-01-17T18:54:01.977 回答
19

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

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

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

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

于 2015-10-07T10:37:35.683 回答
0

您可以在客户端编码并在服务器端解码。这也将处理 \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.5
               num2 = 6.3

               # Add two numbers
               sum = num1 + num2

               # Display the sum
               print('The sum of {0} and {1} is {2}'.format(num1, num2, sum))
       </inputs>
  </Structures>
于 2021-10-26T09:37:02.037 回答
0

虽然不是标准的,但我发现一些 JSON 库具有支持多行字符串的选项。我这样说是要警告的,这会损害您的互操作性。

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

以下是使用Jackson在 Java 上的效果:

JsonMapper mapper = JsonMapper.builder()
   .enable(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS)
   .build()
于 2020-08-31T19:06:43.917 回答
0

使用字符串数组:

{
    "text": [
"line 1 line 1 line 1 line 1 line 1 line 1 line 1 line 1 ",
"line 2 line 2 line 2 line 2 line 2 line 2 line 2 line 2"
     ]
}

然后将它们加入代码中:

<your JSON object>.text.join("\n")
于 2021-10-22T19:32:36.460 回答
-4

试试这个,它还可以处理 JSON.parse() 方法解析失败的单引号,并且还支持 UTF-8 字符代码。

    parseJSON = function() {
        var data = {};
        var reader = new FileReader();
        reader.onload = function() {
            try {
                data = JSON.parse(reader.result.replace(/'/g, "\""));
            } catch (ex) {
                console.log('error' + ex);
            }
        };
        reader.readAsText(fileSelector_test[0].files[0], 'utf-8');
}
于 2020-09-17T00:55:03.450 回答