【问题标题】:Correctly return column as JSON Array in MySQL after using CONCAT, GROUP_CONCAT and JSON_OBJECT使用 CONCAT、GROUP_CONCAT 和 JSON_OBJECT 后,在 MySQL 中将列正确返回为 JSON 数组
【发布时间】: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);
    }
});

【问题讨论】:

    标签: mysql node.js json


    【解决方案1】:

    使用 JSON_EXTRACT 然后得到你期望的结果

    SELECT
            l.id AS id, l.description AS description, l.parent AS parent,
    
            (
                 SELECT JSON_EXTRACT( IFNULL(
                    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`
    

    【讨论】:

    • 这是一个很好的解决方法,但这里唯一的问题是它仍然作为字符串返回
    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2011-11-23
    • 2012-11-07
    • 1970-01-01
    相关资源
    最近更新 更多