Я пытаюсь получить данные типа JSON из Mysql в приложении Node.js через модуль node-mysql.
выполнение этого запроса в БД:
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)
}
Мой вопрос is- Как я могу получить чистый JSON (без обратной косой черты), а не как экранированную строку?
Ожидаемый результат :
{
"id": 3,
"country_name": "Algeria",
"ten_minutes": {"start": 8060, "end": 8089},
"one_minutes": {"start": 18060, "end": 18089},
"thirty_minutes": {"start": 28060, "end": 28089}
}
** Избегайте редактирования возвращаемых данных снова (путем запуска некоторой функции карты).
Благодарю.
Следуя ссылке, предоставленной @vedran-maricevic -
Причина этого в том, что node-mysql передает строки данных как json и включает в себя строки json внутри и -
если вы примените JSON.stringify() к тому, что уже является json-строкой, вы получите строку json с двойным кодированием.
Применение JSON.parse() для каждого объекта json не будет работать и будет вызывать ошибку, потому что это уже 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)
Надеюсь, это поможет кому-то :)