我在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"}
}
]
答案 0 :(得分:3)
有没有办法将上述结果中的包项作为JSON 对象而不是字符串而不迭代数组并做 JSON.parse将字符串转换为JSON?
MySQL 5.7支持JSON data type,因此您可以将包类型更改为JSON
,如果您的客户支持此行,您就不必在每行上迭代并执行JSON.parse
数据类型。
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));
});