如何在JSON数组中转义双引号和单引号

时间:2020-10-21 19:06:17

标签: javascript mysql json

我正在尝试创建一个聊天系统,每次有人发送消息时,都会将该消息添加到该特定人的数据库中的JSON数组中,但是我遇到的问题是,当有人尝试使用双引号时" "或他们的消息中的单引号'。每当添加带有这些特殊字符的消息时,我都会收到错误消息:ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near。我已经在互联网上寻找了类似的问题,并且所有人都说我需要使用\"来避免双引号,但是当我使用JSON.stringify方法时,我已经在这样做了。

不幸的是,这在JSON数组中不起作用,相反,我不得不用\\"替换双引号,但是当我使用JSON.parse方法时,我在输出中看到了反斜杠。而且,如果我只使用一个斜杠,则会出现SQL解析错误。

要发送的消息具有ID,时间戳,消息以及发送者的姓名。 [{"ID": 1, "Timestamp": "10/20/2020 11:00 AM", "Msg": "Hello There", "Name": "John"}]

下面是我要尝试的示例:

let previousMessages = JSON.parse(this.state.Messages);
let newMsg = `testing double "quotes" and single quote's`
previousMessages.push({ID: previousMessages.length+1, Timestamp: new Date(), Msg: newMsg.replace(/"/g,'\\"'), Name: "John"});

对我的数据库的查询如下:

UPDATE table1 SET Messages = "${JSON.stringigy(previousMessages)}" WHERE ID = '1';
// output: UPDATE table1 SET Messages = "[{"ID":1,"Name":"John","Msg":"testing double \\\"quotes\\\" and single quote's","TimeStamp":"10/20/2020 11:00 AM"}]" WHERE ID = '1';

我收到的错误是这样的:

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ID":1,"Name":"John","Msg":"testing double \\\"quotes\\\" and single quote's","T' at line 2

我尝试过的事情

我曾尝试用其他字符替换引号,例如将'替换为_的方法是可行的,但似乎每次创建消息时都不必这样做。

我也尝试在SQL查询中使用单引号而不是双引号,例如:UPDATE table1 SET Messages = '${JSON.stringify(previousMessages)}' WHERE ID = '1';,但这没什么作用

如果有人知道如何在JSON数组中转义这些字符的好方法,那将非常有帮助。我觉得必须有一种简单的方法来转义这些字符,而不是必须为每个字符使用两种不同的replace方法。

3 个答案:

答案 0 :(得分:3)

如果您是直接编写SQL,则在给出有效JSON文本的情况下,您需要:

  • 引号引起来
  • 在其中转义任何单引号
  • 转义任何转义序列

您无需对双引号进行任何操作。

因此JSON:[1, "John O'Brian", { "hello": "world" }]

将成为Messages='[1, "John O\'Brian", { "hello": "world" }]'


如果您想使用JS生成该文件,则该文件应类似于:

const array = [1, "John O'Brian", { "hello": "world" }];
const json = JSON.stringify(array);
const sql = `UPDATE table1 SET Messages='${json.replace(/\\/g, "\\\\").replace(/'/g, "\\'")}' ...`

...但是您不应该那样做。

使用一个API,该API允许您使用占位符并将其留给数据库引擎以弄清楚如何使用引号。它更容易,不易出错,并且更安全。

例如使用NPM的mysql模块:

const array = [1, "John O'Brian", { "hello": "world" }];
const json = JSON.stringify(array);
connection.query(
    "UPDATE table1 SET Messages=? ....",
    [ json ],
    function (error, results, fields) {

     });

答案 1 :(得分:1)

自MYSQL 5.7.8起,已经支持JSON数据类型(由RFC 7159,read more定义)。关于引号字符,您有2个选项;首先是使用JSON_OBJECT定义,如下所示:

UPDATE table1 SET Messages = JSON_OBJECT("message", "quoted \"Value\".");

或通过JSON对象文字设置它(如您所知,必须从JS /后端确保正确的语法):

UPDATE table1 SET Messages = ('{"message": "quoted \\"Value\\"."}');

如前所述,例如,更好的解决方案是使用后端准备好的语句参数/值绑定。如果您的后端是用PHP实现的,则here you can read about it

答案 2 :(得分:-2)

下面的代码删除引号

SET @user_name = JSON_UNQUOTE(JSON_EXTRACT(jsonText,'$.name'));
相关问题