如何处理JSON中的换行符?

pol*_*ear 263 javascript json newline

我已经生成了一些JSON,我试图将它拉入JavaScript中的对象.我一直在收到错误.这就是我所拥有的:

var data = '{"count" : 1, "stack" : "sometext\n\n"}';
var dataObj = eval('('+data+')');
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

unterminated string literal
Run Code Online (Sandbox Code Playgroud)

有了JSON.parse(data),我看到类似的错误消息:Unexpected token ?Chrome中的" unterminated string literal"和Firefox和IE中的" ".

当我取出\nsometext,错误消失了两种情况.我似乎无法弄清楚为什么\n制造evalJSON.parse失败.

Bla*_*laM 338

我想这就是你想要的:

var data = '{"count" : 1, "stack" : "sometext\\n\\n"}';
Run Code Online (Sandbox Code Playgroud)

(您需要转义字符串中的"\"(将其转换为双 - "\"),否则它将成为JSON源中的换行符,而不是JSON数据.)

  • 这当然是正确的,但我想补充说明这一点的原因:http://www.ietf.org/rfc/rfc4627.txt中的JSON规范在第2.5节中包含了这句话:"所有Unicode除了必须转义的字符外,字符可以放在引号内:引号,反向固定和控制字符(U + 0000到U + 001F)." 由于换行符是控制字符,因此必须对其进行转义. (90认同)
  • 人们可能认为转义 `\n` 就是转义 \ (不知道如何在行中引用 \...)作为 \\ 加 `n`。实际上,“\n”是一个控制字符,用 unicode 点表示为“\u000A”。`"\n"` 与 `"\u000A"` 完全相同。所以转义`\n`就是转义`\u000A`。它的转义形式是`\n`,我们应该在Javascript字符串中将\写成\\,这就是为什么`"\\n"`是正确答案。对于 powershell,“\`` 而不是 \ 是转义字符。新行字符表示为“\`n”。`ConvertTo-Json "\`n"` 将得到 `"\n"`,而 `ConvertFrom-Json '"Line 1\nLine 2"'` 将得到两行中的 `Line 1` 和 `Line 2`。 (3认同)
  • + 1.我在理解 JSON 编码时遇到了困难,但“将成为 JSON 源中的换行符,而不是 JSON 数据”让我明白了。 (2认同)

man*_*h_s 34

你需要有它取代的功能\n\\n的情况下,data是不是一个字符串文字.

function jsonEscape(str)  {
    return str.replace(/\n/g, "\\\\n").replace(/\r/g, "\\\\r").replace(/\t/g, "\\\\t");
}

var data = '{"count" : 1, "stack" : "sometext\n\n"}';
var dataObj = JSON.parse(jsonEscape(data));
Run Code Online (Sandbox Code Playgroud)

结果dataObj将是

Object {count: 1, stack: "sometext\n\n"}
Run Code Online (Sandbox Code Playgroud)

  • -1 这个答案首先构造了一个无效的 JSON 字符串(因为换行符是一个控制字符),然后尝试用一系列不完整的替换(控制字符超过 3 个)来修复它。然后最重要的是,它还设法使用了 `eval` 函数。17个赞??? (4认同)
  • 你需要转义转义字符(即`.replace("\\n","\\\\n")`)我还建议使用正则表达式来替换多个实例(即`.replace(/ \n)/g,"\\\\n")`) (2认同)
  • 为什么你需要逃脱逃脱字符?我的意思是`.replace("\n","\\n")``应该做得很好!! 例如,`var test = [{"description":"关于产品的一些描述.这可以是多行文本."}]; console.log(JSON.parse(test.replace(/ \n/g,"\\n")));`将对象完美地输出到浏览器控制台为`[{"description":"关于产品.\n这可以是多行文本."}]` (2认同)

Mar*_* An 9

TLDR:作者问题的解决方案。

使用String.raw文字:

var data = String.raw`{"count" : 1, "stack" : "sometext\n\n"}`;
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这里的所有答案都集中在如何在 JavaScript 中解析 JSON 字符串表示,这可能会导致关于如何在实际 JSON 上表示换行符的混淆。后者不依赖于语言。

严格基于问题标题:

如何处理 JSON 中的换行符?

假设您使用以下代码解析 JSON 文件node(尽管它可以是任何语言):


let obj = JSON.parse(fs.readFileSync('file.json'));
console.log(obj.mykey)
Run Code Online (Sandbox Code Playgroud)

以下是每个可能内容的输出file.json

输入 1:

{
  "mykey": "my multiline
   value"
}
Run Code Online (Sandbox Code Playgroud)

输出 1:

SyntaxError: Unexpected token
Run Code Online (Sandbox Code Playgroud)

输入 2:

SyntaxError: Unexpected token
Run Code Online (Sandbox Code Playgroud)

输出 2:

my multiline
value
Run Code Online (Sandbox Code Playgroud)

输入 3:

{
  "mykey": "my multiline\nvalue"
}
Run Code Online (Sandbox Code Playgroud)

输出 3:

my multiline\nvalue
Run Code Online (Sandbox Code Playgroud)

结论 1:

要在json文件中表示换行符,我们应该使用\n字符. 要表示\n我们应该使用\\n.


我们将如何使用 JavaScript(而不是输入文件)定义上述每个输入:

当我们需要在 JavaScript 中定义一个包含 JSON 的字符串时,事情会发生一些变化,因为\nJavaScript 也具有特殊含义。但也要注意String.raw文字是如何解决这个问题的

输入 1:

my multiline
value
Run Code Online (Sandbox Code Playgroud)

输入 2:

{
  "mykey": "my multiline\\nvalue"
}
Run Code Online (Sandbox Code Playgroud)

输入 3

my multiline\nvalue
Run Code Online (Sandbox Code Playgroud)

结论 2:

json在 javascript 中定义字符串,最简单的方法是使用String.raw,因为它不需要任何转义(除了像这样转义的反引号String.raw`abc${"`"}def` )。

当然,json在 javascript 中创建的最简单方法,通常是将 javascript 对象转换为 json(使用JSON.stringify)。


gav*_*koa 7

根据规范:http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf

jsonStr = "{ \"name\": \"Multi\\nline.\" }";
Run Code Online (Sandbox Code Playgroud)

所以你不能直接传递U+0022U+0022编码.这是被禁止的!规格建议使用的转义序列用于从一些明确定义的代码U+005CU+0000:

jsonStr = "{ \"name\": \"Multi\\nline.\" }";
Run Code Online (Sandbox Code Playgroud)

由于大多数编程语言都U+001F用于引用,你应该转义转义语法(双转义 - 一次用于语言/平台,一次用于Json本身):

jsonStr = "{ \"name\": \"Multi\\nline.\" }";
Run Code Online (Sandbox Code Playgroud)


jer*_*naa 5

好吧,当只需使用 1 个 CSS 类即可完成时,实际上没有必要为此创建一个函数。

只需将您的文字包裹在该类中即可看到神奇之处:D

 <p style={{whiteSpace: 'pre-line'}}>my json text goes here \n\n</p>
Run Code Online (Sandbox Code Playgroud)

注意:因为您始终会在前端使用 HTML 呈现文本,所以您可以将 style={{whiteSpace: 'pre-line'}} 添加到任何标记,而不仅仅是 p 标记。