【问题标题】:node-mysql JSON type returned quoted with backslash返回的 node-mysql JSON 类型用反斜杠引用
【发布时间】:2018-09-27 08:16:55
【问题描述】:

我正在尝试通过 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}
}

** 避免再次编辑返回数据(通过运行一些地图功能..)

谢谢。

【问题讨论】:

标签: mysql sql json node.js sequelize.js


【解决方案1】:

点击@vedran-maricevic 提供的链接 -

它发生的原因是因为 node-mysql 将数据行作为 json 传递,它在内部包含一个 json 行和 -

如果你将 JSON.stringify() 应用于已经是 json 的东西 string 然后你会得到一个双编码的 json 字符串。

在每个 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)

希望对某人有所帮助:)

【讨论】:

    猜你喜欢
    • 2019-06-22
    • 2016-12-02
    • 2014-12-25
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多