如何从Nodejs Mysql获取JSON类型为JSON而不是String

Dee*_*pan 8 mysql node.js mysql-5.7

我在 MySQL 5.7 中有表说 TEST(id INT, attribute JSON)

当我尝试使用 mysql 包在 Nodejs 中查询表时,如下所示

con.query("select * from TEST where id=?", [req.params.id], function (err, results) {
    if (err) throw err;
    console.log(results);
  });
Run Code Online (Sandbox Code Playgroud)

我得到以下输出

[
   {
        "id": 2,
        "package": "{\"tag\": \"tag1\", \"item\": \"item1\"}"
    }
]
Run Code Online (Sandbox Code Playgroud)

有没有办法在不迭代数组的情况下将上述结果中的包项作为 JSON 对象而不是字符串获取并执行 JSON.parse 将字符串转换为 JSON?

预期产出

[
       {
            "id": 2,
            "package": {"tag": "tag1", 
                        "item": "item1"}
        }
    ]
Run Code Online (Sandbox Code Playgroud)

Mar*_*nde 8

有没有办法在不迭代数组的情况下将上述结果中的包项作为 JSON 对象而不是字符串获取并执行 JSON.parse 将字符串转换为 JSON?

MySQL 5.7 支持JSON 数据类型,因此您可以将包类型更改为JSON并且您不必JSON.parse在每一行上迭代和执行,如果您的客户端支持此数据类型。

请记住,mysql包不支持它,但mysql2支持。

CREATE TABLE `your-table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `package` json DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

现在包将是一个数组/对象:

con.query("select * from TEST where id=?", [req.params.id], function (err, results) {
    if (err) throw err;
    console.log(results[0].package.tag); // tag1 using mysql2
    console.log(results[0].package.item); // item1 using mysql2
});
Run Code Online (Sandbox Code Playgroud)

如果您运行的 MySQL 版本低于 5.7 或者您不想使用该JSON类型,则需要自己迭代和解析它。

您可以使用这种衬垫:

results = results.map(row => (row.package = JSON.parse(row.package), row));
Run Code Online (Sandbox Code Playgroud)

如果您想知道是否应该或不应该将 JSON 存储在关系数据库中,那么这个问题中有一个很好的讨论:

将 JSON 存储在数据库中与为每个键创建一个新列

  • @Deepan 检查我更新的答案,你必须使用 `mysql2` 包!而且您没有提到您使用的是 JSON 数据类型。 (2认同)
  • 关键也是 mysql2 包。谢谢! (2认同)

小智 5

这与 Tanner 的答案略有不同,但是,如果您使用节点mysql库并且已使用 MySQL 的 JSON 数据类型在数据库中定义了字段,则可以在最初设置连接以转换任何 JSON 时使用“类型转换” - 任何对 JSON 对象的查询返回的类型化值:

let connection = mysql.createConnection(
  {typeCast: function (field, next) {
    if (field.type === "JSON") {
      return JSON.parse(field.string());
    } else {
      return next();
    }
  }}
);
Run Code Online (Sandbox Code Playgroud)