如何从nodejs mysql获取json类型为json而不是字符串

zynd9foi  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(457)

我在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"}
        }
    ]
9gm1akwq

9gm1akwq1#

可以将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);
lrpiutwd

lrpiutwd2#

有没有一种方法可以将上述结果中的包项作为json对象而不是字符串来获取,而无需迭代数组并执行json.parse将字符串转换为json?
MySQL5.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;

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

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,那么在这个问题上有一个很好的讨论:
在数据库中存储json与每个键都有一个新列

wljmcqd8

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

});

相关问题