【发布时间】:2020-05-01 07:29:11
【问题描述】:
我在 Node.JS API 中使用 MySQL,所以我需要从数据库中以 JSON 对象/数组的形式获取数据。
我正在尝试获取一个嵌套在结果 JSON 中的 JSON 数组作为值之一,所以这是我当前的查询:
SELECT
l.id AS id, l.description AS description, l.parent AS parent,
(
SELECT CONCAT(
'[',
GROUP_CONCAT(
JSON_OBJECT(
'id', a.id, 'description', a.description,
'ip', a.ip, 'lastmovementdetected', a.lastmovementdetected
)
),
']'
)
FROM airconditioners AS a WHERE location = l.id
) AS airconditioners
FROM locations as l`
但是,这是查询结果(实际输出是这些 JSON 对象的数组):
{
"id": 1,
"description": "Meu quarto",
"parent": 0,
"airconditioners": "[{\"id\": 1, \"ip\": \"192.168.137.96\", \"description\": \"Ar-condicionado\", \"lastmovementdetected\": null},{\"id\": 2, \"ip\": \"192.168.0.1\", \"description\": \"Ar-condicionado\", \"lastmovementdetected\": null},{\"id\": 3, \"ip\": \"192.168.0.1\", \"description\": \"Ar-condicionado\", \"lastmovementdetected\": null}]"
}
SQL 将 JSON 数组作为字符串返回,并且它还在 JSON 中转义双引号。
这是预期回报:
"id": 1,
"description": "Meu quarto",
"parent": 0,
"airconditioners": [
{
"id":1,
"ip":"192.168.137.96",
"description":"Ar-condicionado",
"lastmovementdetected":null
},
{
"id":2,
"ip":"192.168.0.1",
"description":"Ar-condicionado",
"lastmovementdetected":null
},
{
"id":3,
"ip":"192.168.0.1",
"description":"Ar-condicionado",
"lastmovementdetected":null
}
]
这可以仅使用 SQL 查询来完成吗?或者我必须在通过 API 发送响应之前处理结果?
我尝试用CAST((SELECT...) AS JSON) AS airconditioners 包围该列,并将JSON_UNQUOTE() 放在许多地方,但没有任何成功。
编辑
我无法得出 MySQL 是否与我想要的兼容的结论。但是,例如,我使用以下 Javascript 代码来解决它:
Object.keys(result).forEach(key => {
let airconditioners = result[key].airconditioners;
if(airconditioners == null) {
// If the airconditioner field is null, then we replace it with an empty array
result[key].airconditioners = [];
} else {
result[key].airconditioners = JSON.parse(airconditioners);
}
});
【问题讨论】: