字符串中的怪异符号会破坏JSON.parse,但似乎无法检测到?

时间:2018-08-10 17:53:48

标签: javascript jquery json

描述字段是一个文本区域字段,用户最终以某种方式在其中带有一些奇怪的小符号。 (参见图片)

enter image description here

当我从服务器上获取该数据时,我将从获取的对象中收集数据,包括对该对象的描述,并将其转换为JSON字符串,然后将其发送到我的javascript中。

从javascript,我进行JSON.parse。但是那个奇怪的小符号会导致解析失败。但是,当您查看它时,那里没有任何字符,但是它在JSON.parse中引发了未定义的字符。

我在服务器上的回复如下所示:

"blahblahtesttext\r\nslkdjf",

除了期望的\ r \ n ......

但是该符号所在的位置有一个意外的令牌。

{"value":"blah blah test text//Symbol should be here, but there is nothing and it forces it to the next line
\r\nslkdjf","fieldType":"TEXTAREA","field":"Description"}

该符号将字符串强制移至下一行,从而引起问题。

因为我看不到实际字符是什么...我不知道该如何处理。

是否有一些东西可以去除JSON字符串中的无效字符,以便进行解析?我不想只是尝试/抓住它,因为它会丢掉所有东西,我只想删除那个奇怪的无效符号。

还是有办法查看JSON.parse不喜欢的实际字符是什么?

<-如果要尝试解析它,这是用于复制粘贴到字符串中的符号。

编辑:

我发现它是在Notepad ++中完成的

enter image description here

在哪里可以看到行分隔符所在的位置,它将实际的回车符和换行符放置在此处,从而中断了字符串。对于在该行分隔符后面的实际文本区域中放置的两个返回,它已经具有\ r \ n \ r \ n。

但是仍然不确定如何处理,因为回车符和换行符不会在字符串中显示为'\ n \ r',因此它们没有字符表示,而是实际上在其中放了一个回车符并断开字符串。

新编辑:

最后找到了一些可以使它起作用的方法。我无法对该行分隔符进行替换。当我从数据库中提取它时,它作为隐藏的回车符来传递。当您在文本区域中手动按下“ Enter”键时,我从数据库中获得的字符串实际上会在其中放置“ \ r \ n”。但是行分隔符没有。

因此,我在解析之前添加了这三行,以确保转义任何无效的新行/回车符。

result = result.replace(/\r\n/g, '\\r\\n');
result = result.replace(/\r/g, '\\r');
result = result.replace(/\n/g, '\\n');

实际上字符串中的'\ r \ n'已经被正确地转义了,这使我绊倒了,因为在有人尝试引入此行分隔符之前,我不必担心将它们转义。...

1 个答案:

答案 0 :(得分:2)

正如Xufox所说,这似乎是U+2028JSON.parse应该不会失败,因为U + 2028不需要在JSON中转义。 Chrome没有,但是那可能是因为它正在实现this stage 4 proposal Xufox pointed out

const o = {prop: "testing\u2028one two three"};
console.log(JSON.parse(JSON.stringify(o)));

如果您需要解决无法处理的JSON.parse实现,则可以执行以下操作:

str = str.replace(/\u2028/g, "\\u2028");

...在JSON.parse上运行str之前。