天天看点

JSON中的多行字符串 例 多行字符串长度

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

\\

\\n

作为转义。

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

#1楼

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

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

"\\"

)或使用

"\\n"

作为转义。

但请记住:如果你在python中使用字符串,特殊的转义字符(

"\\t"

"\\n"

)将被转换为REAL控制字符!

"\\n"

将替换为表示换行符的ASCII控制字符,该字符恰好是JSON中非法的字符。 (至于续行字符,它只需要换行。)

所以你需要做的是防止Python转义字符。 您可以通过使用原始字符串(将

r

放在字符串前面,如

r"abc\\ndef"

,或者在换行符前面加一个额外的斜杠(

"abc\\\\ndef"

)来完成此操作。

以上两种方法都不会将

"\\n"

替换为真正的换行符ASCII控制字符,而是将

"\\n"

作为两个文字字符,然后JSON可以将其解释为换行符。

#2楼

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

  • any-Unicode-character-except-

    "

    -or-

    \\

    -or-control-character
  • \\"

  • \\\\

  • \\/

  • \\b

  • \\f

  • \\n

  • \\r

  • \\t

  • \\u\u003c/code> 四个十六进制数字

换行符是“控制字符”,所以不,你的字符串中可能没有文字换行符。 但是,您可以使用

\\n

\\r

\\n

所需的任何组合对其进行编码。

#3楼

将多行文本放在txt文件上然后

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

(它在mongoDB上运行)

#4楼

JSON不允许真正的换行符。 您需要用

\\n

替换所有换行符。

例如:

"first line second line"

可以保存:

"first line\\nsecond line"

注意:

对于

Python

,这应该写成:

"first line\\\\nsecond line"

其中

\\\\

是用于转义反斜杠,否则python会将

\\n

视为控制字符“new line”

#5楼

使用正则表达式将所有出现的

\\r\\n

替换为

\\\\n

这在scala中对我有用。

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

#6楼

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

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

#7楼

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

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

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

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

#8楼

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

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

x={text:"hello\nworld"}
           

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

console.log(x.text)
hello
world
           

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

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

使用

JSON.stringify

JSON.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'),字符串中也只存储一个字符。

#9楼

使用json5(loader)参见https://json5.org/ - example(by json5)

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

#10楼

尝试使用

base64

编码的字符串值。 大部分时间都在为我工作。

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

base64

编码后的字符串看起来像

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

base64编码和解码以所有语言提供。

#11楼

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

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

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

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

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

#12楼

如果您愿意使用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字符串化。 -e选项评估字符串,

-p

选项将最后一个Node.js操作的返回结果回显到stdout。

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

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

#13楼

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

,具体取决于我是否要在每个字符串之后换行。