JSON 解析意外的标记 h 导致字符串值中的引号

JSON Parse Unexpected token h caused quotes inside string value

我有一个从 table 获得的 JSON 字符串,这是我的 JSON

    {"subtitle":"Information","desc":"Hi, Welcome.\n                            <br><br>\n                            You can access our website <a href=\"https://test.com\">here</a>.\n                            <br><br>\n                            Dont forget, cost: only ! \n                            <br>\n                            <br>\n                            <br>\n                            <br>\n                            Thankyou,<br>\n                            Regards"}

当我尝试执行 json.parse() 但出现错误时

SyntaxError: Unexpected token h in JSON at position 154.

我认为这是因为 URL 中的引号 " 或冒号 :.

如何将它们传递给 JSON?

更新

这是我获取数据的方式:

var body_inbox = {};
body_inbox.subtitle = 'Information';
body_inbox.desc = `Hi, Welcome.
                    <br><br>
                    You can access our website <a href="https://test.com">here</a>.
                    <br><br>
                    Dont forget, cost: only !
                    <br>
                    <br>
                    <br>
                    <br>
                    Thankyou,<br>
                    Regards`;

body_inbox = JSON.stringify(body_inbox);

我很困惑,我在 table 中发现许多数据在换行符 \n 和 url <a href=\"https://test.com\">here</a> 中有双反斜杠。我只是尝试用 JSON.stringify 创建新数据,结果是 \n<a href=\"https://test.com\">here</a>。为什么会这样?

备注

抱歉,前面的数据是错字,有误导。

应该是<a href=\"https://test.com\">不是<a href="\https://test.com\">

双反斜杠应该是单反斜杠。单个反斜杠转义后面的字符,所以你对双斜杠所做的就是转义第二个反斜杠。它在 href 上阻塞,因为后面的引号结束了字符串,之后解析器将 url 中的“h”作为原始字符。

{ message: "...our website <a href=\"https://test.com\">here</a>" }
//                                   ^ parser thinks the string ends here
//                                     and doesn't know what to make of
//                                     https://...

我的猜测是数据被两个不同的进程转义了两次(或者同一进程 运行 两次)。

假设示例:数据被创建,并在进入数据库的过程中被转义。所以现在所有引号前面都有一个反斜杠。然后对数据进行编辑并在数据库中更新记录,转义再次得到运行。但是输入字符串从第一次开始就已经有反斜杠了,因为反斜杠本身很特殊,需要转义,当字符串在返回数据库的途中(再次)被转义时,你最终会得到双反斜杠。

你在控制台转义一个字符串两次就可以看到这种东西。 (这不是在做反斜杠,但它说明了问题):

const input = '"This string is quoted."';

const once = encodeURI(input);
// encodes the quotes as '%22'
// "%22This%20string%20is%20quoted.%22"

const twice = encodeURI(once);
// encodes the '%' in '%22' as '%25', and you end up with `%2522`
// "%2522This%2520string%2520is%2520quoted.%2522"

json 中的双引号(在值中)只需要一个正斜杠 (\)。 所以你的 json 应该是

{"subtitle":"Information","desc":"Hi, Welcome.\n                            <br><br>\n                            You can access our website <a href=\"https://test.com\">here</a>.\n                            <br><br>\n                            Dont forget, cost: only ! \n                            <br>\n                            <br>\n                            <br>\n                            <br>\n                            Thankyou,<br>\n                            Regards"}

使用模板字符串保存数据。

const json = `{"subtitle":"Information","desc":"Hi, Welcome.\n<br><br>\nYou can access our website <a href=\"https://test.com\">here</a>.\n<br><br>\nDont forget, cost: only !\n<br>\n<br>\n<br>\n<br>\n Thankyou,<br>\n Regards"}`
console.log(JSON.parse(json))

(贴出问题作者的回答移到答案space).

非常感谢您的所有回答。这有助于弄清楚解析失败是由双反斜杠转义第二个反斜杠而不是双引号 " 引起的。

数据有双反斜杠,因为这是来自克隆数据库的数据,我认为它发生在转换为 SQL 文件的过程中。