首页 > 解决方案 > 字符串中的奇怪符号会破坏 JSON.parse,但似乎无法检测到?

问题描述

描述字段是一个文本区域字段,不知何故,用户在其中得到了一些奇怪的小符号。(见图)

在此处输入图像描述

当我从服务器抓取它时,我从抓取的对象中组装我的数据,其中包括该对象的描述,并将其转换为 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 不喜欢的实际字符是什么?


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

编辑:

我发现它在记事本++中这样做

在此处输入图像描述

您可以看到行分隔符所在的位置,它在那里放置了实际的回车和换行符,从而破坏了字符串。对于放置在该行分隔符之后的实际文本区域中的两个返回,它已经具有 \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' 已经被正确地转义了,这让我很吃惊,因为在有人尝试引入此行分隔符之前我不必担心转义这些内容....

标签: javascriptjqueryjson

解决方案


正如 Xufox 所说,那似乎是U+2028JSON.parse不应该失败,因为 U+2028 不需要在 JSON 中转义;Chrome 没有,但这可能是因为它正在实施这个第 4 阶段的提案 Xufox 指出

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


推荐阅读