mysql - 返回的node-mysql JSON类型用反斜杠引用

标签 mysql sql json node.js sequelize.js

我正在尝试通过node-mysql模块从Node.js应用程序中的Mysql获取JSON类型数据。

在数据库上运行此查询:

SELECT countries.id,
   countries.country_name,
   Json_object("start", start_port, "end", end_port)
   ten_minutes,
   Json_object("start", start_port + 10000, "end", end_port + 10000)
   one_minutes,
   Json_object("start", start_port + 20000, "end", end_port + 20000)
   thirty_minutes
FROM   countries
   JOIN countries_port_ranges
     ON country_id = countries.id;

返回:

1   Afghanistan {"start": 8000, "end": 8029}    {"start": 18000, "end": 18029}  {"start": 28000, "end": 28029}
2   Albania {"start": 8030, "end": 8059}    {"start": 18030, "end": 18059}  {"start": 28030, "end": 28059}
3   Algeria {"start": 8060, "end": 8089}    {"start": 18060, "end": 18089}  {"start": 28060, "end": 28089}

当我通过 node-mysql 或 Sequelize 运行此查询时,我得到以下结果:

 [{
    "id": 1,
    "country_name": "Afghanistan",
    "ten_minutes": "{\"start\": 8000, \"end\": 8029}",
    "one_minutes": "{\"start\": 18000, \"end\": 18029}",
    "thirty_minutes": "{\"start\": 28000, \"end\": 28029}"
},
{
    "id": 2,
    "country_name": "Albania",
    "ten_minutes": "{\"start\": 8030, \"end\": 8059}",
    "one_minutes": "{\"start\": 18030, \"end\": 18059}",
    "thirty_minutes": "{\"start\": 28030, \"end\": 28059}"
},
{
    "id": 3,
    "country_name": "Algeria",
    "ten_minutes": "{\"start\": 8060, \"end\": 8089}",
    "one_minutes": "{\"start\": 18060, \"end\": 18089}",
    "thirty_minutes": "{\"start\": 28060, \"end\": 28089}"
}] 

app.js:

async (req, res) => {
    const q = `SELECT...`
    const query = await sequelize.query(q, { type: sequelize.QueryTypes.SELECT })
    res.send(query)
}    

我的问题是 - 如何获得纯 JSON(不带反斜杠)而不是转义字符串?

预期:

{
    "id": 3,
    "country_name": "Algeria",
    "ten_minutes": {"start": 8060, "end": 8089},
    "one_minutes": {"start": 18060, "end": 18089},
    "thirty_minutes": {"start": 28060, "end": 28089}
}

** 避免再次编辑返回数据(通过运行某些 map 函数..)

谢谢。

最佳答案

按照@vedran-maricevic 提供的链接 -

发生这种情况的原因是因为node-mysql将数据行作为json传递,并且它内部包含一个json行 -

if you apply JSON.stringify() to something that's already a json string then you'll get a double-encoded json string.

对每个 json 对象应用 JSON.parse() 不起作用,并且会抛出错误,因为它已经是一个 json 对象。

如此快速而肮脏的解决方案是仅在双编码字段上应用 JSON.parse() :

const _parsed = query.map(obj => {
        const tmp = {}
        tmp.id = obj.id
        tmp.country_name = obj.country_name
        tmp.ten_minutes = JSON.parse(obj.ten_minutes) // double-encoded field
        tmp.one_minutes = JSON.parse(obj.one_minutes) // double-encoded field
        tmp.thirty_minutes = JSON.parse(obj.thirty_minutes) // double-encoded field
        return tmp
    })
    res.send(parsed)

希望它能帮助别人:)

关于mysql - 返回的node-mysql JSON类型用反斜杠引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49876825/

相关文章:

sql - 通过读取一些 MySQL 转储来忽略 mysql 中的错误

MySQL MAX Date - 单连接表 - 仅选择第一个 fkUserId 匹配

java - Hibernate如何使用外键向表添加新行

javascript - JSON 从 url 到 PHP 表

java - 当查询父级时,子级也被获取,Hibernate

php - Linux 上 PHP 的真实 max_execution_time

mysql - 查询中不同子串的计数

sql - 自动匹配 INSERT INTO ... SELECT ... FROM 中的列

sql - 在 SQL 中合并两个表,并使用一个公共(public)列

java - JSON 请求调整 URL 参数