TLDR:作者问题的解决方案。
使用String.raw
文字:
var data = String.raw`{"count" : 1, "stack" : "sometext\n\n"}`;
出于某种原因,这里的所有答案都集中在如何在 JavaScript 中解析 JSON 字符串表示,这可能会导致关于如何在实际 JSON 上表示换行符的混淆。后者不依赖于语言。
严格基于问题标题:
如何处理 JSON 中的换行符?
假设您使用以下代码解析 JSON 文件node
(但它可以是任何语言):
let obj = JSON.parse(fs.readFileSync('file.json'));
console.log(obj.mykey)
以下是每个可能内容的输出file.json
:
输入 1:
{
"mykey": "my multiline
value"
}
输出 1:
SyntaxError: Unexpected token
输入 2:
{
"mykey": "my multiline\nvalue"
}
输出 2:
my multiline
value
输入 3:
{
"mykey": "my multiline\\nvalue"
}
输出 3:
my multiline\nvalue
结论一:
要在json
文件中表示换行符,我们应该使用\n
字符. 要表示\n
我们应该使用\\n
.
我们将如何使用 JavaScript(而不是输入文件)定义上述每个输入:
当我们需要在 JavaScript 中定义一个包含 JSON 的字符串时,事情会发生一些变化,因为\n
JavaScript 也具有特殊含义。但也要注意String.raw
文字是如何解决这个问题的。
输入 1:
let input1 = '{"mykey": "my multiline\nvalue"}'
//OR
let input1 = `{
"mykey": "my multiline
value"
}`;
//OR
let input1 = String.raw`{
"mykey": "my multiline
value"
}`;
console.log(JSON.parse(input1).mykey);
//SyntaxError: Unexpected token
//in JSON at position [..]
输入 2:
let input2 = '{"mykey": "my multiline\\nvalue"}'
//OR
let input2 = `{
"mykey": "my multiline\\nvalue"
}`;
//OR (Notice the difference from default literal)
let input2 = String.raw`{
"mykey": "my multiline\nvalue"
}`;
console.log(JSON.parse(input2).mykey);
//my multiline
//value
输入 3:
let input3 = '{"mykey": "my multiline\\\\nvalue"}'
//OR
let input3 = `{
"mykey": "my multiline\\\\nvalue"
}`;
//OR (Notice the difference from default literal)
let input3 = String.raw`{
"mykey": "my multiline\\nvalue"
}`;
console.log(JSON.parse(input3).mykey);
//my multiline\nvalue
结论 2:
要json
在 javascript 中定义字符串,最简单的方法是使用String.raw
,因为它不需要任何转义(除了像这样转义的反引号String.raw`abc${"`"}def`
)。
当然,json
在 javascript 中创建最简单的方法,通常是将 javascript 对象转换为 json(使用JSON.stringify
)。