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