我在MySQL5.7中有表say 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条答案
按热度按时间9gm1akwq1#
可以将typecast函数传递给mysql连接/池。在我的例子中,如果可能的话,我想将所有长文本字段转换成json。如果失败了,你仍然可以得到原值。
lrpiutwd2#
有没有一种方法可以将上述结果中的包项作为json对象而不是字符串来获取,而无需迭代数组并执行json.parse将字符串转换为json?
MySQL5.7支持json数据类型,因此您可以将包类型更改为
JSON
而且你不需要迭代和执行JSON.parse
在每一行上,如果您的客户机支持此数据类型。请记住,mysql包不支持它,但mysql2支持它。
现在包将是一个数组/对象:
如果您运行的mysql版本低于5.7或您不想使用
JSON
类型,您需要自己迭代和解析它。你可以用这一行:
如果您想知道是否应该在关系数据库中存储json,那么在这个问题上有一个很好的讨论:
在数据库中存储json与每个键都有一个新列
wljmcqd83#
我想你需要做的就是
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));
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));