TLDR:作者问题的解决方案。
您生成的json是错误的,因为它在其中一个值中包含换行符。要在其中一个值中生成一个表示(不包含)换行符的json,您可以使用:
使用字符串。原始的文字:
var data = String.raw`{"count" : 1, "stack" : "sometext\n\n"}`;
或应用JSON。Stringify为一个javascript对象(首先是类似json的)。
var data = JSON.stringify({"count" : 1, "stack" : "sometext\n\n"});
出于某种原因,这里所有的答案都集中在如何在JavaScript中解析JSON字符串表示,这可能会导致关于如何在实际JSON中表示换行符的困惑。后者不依赖于语言。
严格根据题目:
我如何处理JSON中的换行符?
让我们假设你在node中使用以下代码解析一个JSON文件(它可以是任何语言):
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
结论1:
要在json文件中表示换行符,我们应该使用\n字符。我们应该用\\n来表示\n。
我们如何使用JavaScript(而不是输入文件)定义上述每个输入:
当我们需要在JavaScript中定义一个包含JSON的字符串时,事情会发生一些变化,因为\n对于JavaScript也有特殊的意义。但还要注意String。原始文字修复了这个问题。
Input1:
let input1 = '{"mykey": "my multiline\nvalue"}'
//OR
let input1 = `{
"mykey": "my multiline
value"
}`;
//(or even)
let input1 = `{
"mykey": "my multiline\nvalue"
}`;
//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:
要在javascript中定义一个json字符串,最简单的方法是使用string。raw,因为它不需要任何转义(除了backtick,它像这个字符串一样转义。生'abc ${“’”}def”)。
当然,在javascript中创建json最简单的方法通常是将javascript对象转换为json(使用json .stringify)。
重要提示:
Don't get confused by how chrome/firefox devtools preview variables containing newlines (e.g. when you just write the variable name and press Enter). When previewing objects they always represent newlines of string values like \n. But, when previewing a string (e.g. dataObj.stack) firefox will show a newline as an empty line but chrome will still show it as \n. So, to be safe, you should always preview with console.log(dataObj.stack) to better understand what's actually contained inside the specific variable.