Answers:
JSON不允许使用实际的换行符。您需要将所有换行符替换为\n
。
例如:
"first line
second line"
可以保存为:
"first line\nsecond line"
注意:
对于Python
,应写为:
"first line\\nsecond line"
这里\\
是逃离反斜杠,否则蟒蛇将把\n
作为控制字符“新线”
\n
并通过Curses输出数据)\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>"
],
}
这对我来说看起来很整洁,因为我必须在所有地方都使用双引号。尽管不是这样,我也许可以使用YAML,但这有其他陷阱,并且本机不支持。解析后,我只使用myData.modify_head.join('\n')
或myData.modify_head.join()
,这取决于我是否要在每个字符串后换行。
不幸的是,这里的许多答案都解决了如何在字符串数据中放置换行符的问题。问题是如何通过将字符串值分成多行代码来使代码看起来更好。(甚至认识到这一点的答案也提供了“解决方案”,这些解决方案假定一个人可以自由更改数据表示形式,而在许多情况下则不能。)
更糟糕的消息是,没有好的答案。
在许多编程语言中,即使它们不显式支持跨行分割字符串,您仍然可以使用字符串串联来获得所需的效果;只要编译器不是很糟糕,就可以了。
但是json不是一种编程语言;这只是一个数据表示。您不能告诉它连接字符串。它的(相当小的)语法也不包含任何表示多行字符串的功能。
缺少设计某种预处理器的过程(而我,其中一个,我感觉自己无法有效地用自己的语言来解决这个问题),但是没有一个通用的解决方案。如果可以更改数据格式,则可以替换字符串数组。否则,这是json并非为人类可读性而设计的众多方式之一。
查看规格!JSON语法的char生成可以采用以下值:
"
- \
或- 或控制字符\"
\\
\/
\b
\f
\n
\r
\t
\u
四十六进制数字换行符是“控制字符”,因此,不,您的字符串中可能没有文字换行符。但是,您可以使用\n
和\r
所需的任意组合对其进行编码。
JSON不允许换行以提高可读性。
最好的选择是使用可以自动换行的IDE。
这是一个非常老的问题,但我在搜索中遇到了这个问题,我想我知道您问题的根源。
JSON不允许在其数据中使用“真实”换行符;它只能逃脱换行符。查看答案从@YOU。根据问题,您似乎试图通过两种方式对换行符进行转义:通过使用换行符("\"
)或将其"\n"
用作转义符。
但请记住:如果您在python中使用字符串"\t"
,"\n"
则会将特殊的转义字符(,)转换为REAL控制字符!该"\n"
会代表一个换行符,而这恰恰是在JSON非法字符的ASCII控制字符替换。(关于换行符,它只是将换行符取出。)
因此,您需要做的是防止Python转义字符。您可以通过使用原始字符串(例如r
,在字符串前面放置r"abc\ndef"
,或在换行符("abc\\ndef"
)之前添加一个额外的斜杠)来实现此目的。
以上两种方法都"\n"
将保留"\n"
两个文字字符,而JSON可以将其解释为换行符转义,而不是用实际的换行符ASCII控制字符代替。
将属性值写为字符串数组。就像这里给出的示例https://gun.io/blog/multi-line-strings-in-json/。这会有所帮助。
我们总是可以将字符串数组用于多行字符串,如下所示。
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
而且,我们可以轻松地迭代数组以多行方式显示内容。
使用json5(加载程序),请参见https://json5.org/-示例(由json5)
{
lineBreaks: "Look, Mom! \
No \\n's!",
}
JSON中是否可以包含多行字符串?
是。我现在使用Firefox Web浏览器进行了测试,方法是按F12,单击控制台,然后在屏幕底部键入内容。
x={text:"hello\nworld"}
刚刚从包含多行字符串的JSON格式字符串创建了对象x。
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”),字符串中也只存储了一个字符。
x={"a":NaN}
和x={"a":"a \<literal newline with SHIFT>b"}
,这是不是JSON,但JavaScript的
使用表达式替换所有出现的\r\n
用\\n
。
这在scala对我有用。
val newstr = str.replace("\r\n", "\\n")
如果您愿意使用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轻松地进行JSON字符串化。-e选项计算字符串,该-p
选项将上一个Node.js操作的返回结果回显到stdout。
如果要加载位于不同工作目录中的.js脚本,则必须切换“”和“”字符串:
my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`
尝试使用base64
编码的字符串值。大多数时候为我工作。
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
base64
编码后的字符串看起来像
{
"singleLine": "Some singleline String",
"multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ=="
}
base64编码和解码支持所有语言。
将多行文字放在txt文件上,然后
var str = {
text: cat('path_to_file/text.txt')
}
(它的工作在mongoDB上)
cat
。