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)
** 避免再次编辑返回数据(通过运行某些地图函数..)
谢谢。
按照@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)
希望它能帮助别人:)
| 归档时间: |
|
| 查看次数: |
2562 次 |
| 最近记录: |