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

Dav*_*idA 1 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;
Run Code Online (Sandbox Code Playgroud)

返回:

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}
Run Code Online (Sandbox Code Playgroud)

当我通过 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}"
}] 
Run Code Online (Sandbox Code Playgroud)

应用程序.js:

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

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

预期的:

{
    "id": 3,
    "country_name": "Algeria",
    "ten_minutes": {"start": 8060, "end": 8089},
    "one_minutes": {"start": 18060, "end": 18089},
    "thirty_minutes": {"start": 28060, "end": 28089}
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢。

Dav*_*idA 5

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

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

如果将 JSON.stringify() 应用于已经是 json 字符串的内容,那么您将获得双重编码的 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)
Run Code Online (Sandbox Code Playgroud)

希望它能帮助别人:)