javascript - 字符串中的奇怪符号会破坏 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' 已经被正确地转义了,这让我很吃惊,因为在有人尝试引入此行分隔符之前我不必担心转义这些内容....
解决方案
正如 Xufox 所说,那似乎是U+2028。JSON.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
。
推荐阅读
- c# - WPF 不显示垂直滚动条
- salesforce - 用于标准 API 的 Mulesoft 4 Salesforce 集成
- mysql - SQL 在用户输入值上使用 LIKE
- javascript - 如何在不编辑的情况下使用原始数据文件
- ios - 后台监听 AVAudioSession 路由变化
- flutter - 无法在飞镖中映射项目列表(对象引用)
- node.js - Node.js - EventListener - 仅捕获触发数据事件的套接字的关闭事件
- php - 如何替换 URL 中的 GET 参数
- python - SymPy 的多元最小值
- python - Python:复杂的字典列表