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

时间:2018-04-17 02:52:33

标签: mysql node.js mysql-5.7

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

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

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

我得到以下输出

[
   {
        "id": 2,
        "package": "{\"tag\": \"tag1\", \"item\": \"item1\"}"
    }
]

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

预期产出

[
       {
            "id": 2,
            "package": {"tag": "tag1", 
                        "item": "item1"}
        }
    ]

3 个答案:

答案 0 :(得分:3)

  

有没有办法将上述结果中的包项作为JSON   对象而不是字符串而不迭代数组并做   JSON.parse将字符串转换为JSON?

MySQL 5.7支持JSON data type,因此您可以将包类型更改为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;

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

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
});

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

你可以使用这个衬垫:

results = results.map(row => (row.package = JSON.parse(row.package), row));

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

Storing JSON in database vs. having a new column for each key

答案 1 :(得分:0)

您可以将typeCast函数传递给mysql连接/池。就我而言,如果可能的话,我想将所有长文本字段都转换为JSON。万一失败,您仍将获得原始值。

let auth = {database:'db', password:'pw', user:'u', host:'host.com' };
auth.typeCast = function(field, next) {
    if (field.type == 'BLOB' && field.length == 4294967295) {
        let value = field.string();
        try {
            return JSON.parse(value);
        } catch (e) {
            return value;
        }
    }
    return next();
};
let connection = mysql.createConnection(auth);

答案 2 :(得分:-2)

我认为您需要做的只是JSON.parse(results)

con.query("select * from TEST where id=?", [req.params.id], function (err, results) {
if (err) throw err;
console.log(JSON.parse(results));

});

EDIT!评论者注意到你需要迭代结果,我的答案很仓促,不会起作用:

con.query("select * from TEST where id=?", [req.params.id], function (err, results) {
if (err) throw err;
results = results.map(row => (row.package = JSON.parse(row.package), row));

});