JSON中的多行字符串

时间:2010-03-06 14:29:53

标签: json string syntax multiline

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

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

15 个答案:

答案 0 :(得分:330)

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

例如:

"first line second line"

可以保存:

"first line\nsecond line"

注意:

对于Python

应该写为:

"first line\\nsecond line"

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

答案 1 :(得分:173)

我必须为一个小型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(),具体取决于我是否要在每个字符串后换行。

答案 2 :(得分:94)

查看the specification! JSON语法的 char 生产可以采用以下值:

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

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

答案 3 :(得分:36)

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

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

答案 4 :(得分:35)

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

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

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

所以你需要做的是防止Python转义字符。您可以使用原始字符串(将r放在字符串前面,如r"abc\ndef"中),或者在换行符前加一个斜杠("abc\\ndef")。< / p>

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

答案 5 :(得分:29)

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

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

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

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

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

答案 6 :(得分:13)

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

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

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)

给予

experts
exchange

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

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

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

多行字符串长度

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

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

答案 7 :(得分:11)

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

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

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

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

答案 8 :(得分:9)

使用正则表达式将所有\r\n替换为\\n

这对我来说很有用。

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

答案 9 :(得分:3)

使用json5(loader)参见https://json5.org/ - 示例(通过json5)

{
  lineBreaks: "Look, Mom! \
No \\n's!",
}

答案 10 :(得分:1)

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

DEFERRABLE INITIALLY DEFERRED

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

module.exports = {

  multilineStr: `

     dis my life 
     it's now or never

  `

}

您会得到:

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

工作原理:您使用Node.js加载JS模块,该模块创建了一个JS对象,该对象可以很容易地由Node.js JSON字符串化。 -e选项计算字符串,而{"multilineStr":"\n \n dis my life\n it's now or never\n \n "} 选项将上一个Node.js操作的返回结果回显到stdout。

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

-p

答案 11 :(得分:0)

虽然不是标准的,但我发现某些JSON库具有支持多行字符串的选项。请注意,这将损害您的互操作性。

但是,在我遇到的特定情况下,我需要制作一个配置文件,该文件只能由一个系统读取并可由人类管理。并最终选择了此解决方案。

这是使用 Jackson 在Java上实现的方式:

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

答案 12 :(得分:0)

尝试此操作,它还处理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');
}

答案 13 :(得分:-4)

尝试使用base64编码的字符串值。大部分时间都在为我工作。

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 
base64编码后的字符串看起来像

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

base64编码和解码适用于所有语言。

答案 14 :(得分:-17)

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

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

(它在mongoDB上运行)