如何在MySQL中将结果表转换为JSON数组

时间:2017-01-20 08:10:32

标签: mysql json

我想在MySQL中将结果表转换为JSON数组,最好只使用普通的MySQL命令。例如,使用查询

SELECT name, phone FROM person;

| name | phone |
| Jack | 12345 |
| John | 23455 |

预期的JSON输出为

[
  {
    "name": "Jack",
    "phone": 12345
  },
  {
    "name": "John",
    "phone": 23455
  }
]

有没有办法在普通的MySQL中做到这一点?

编辑:

有一些答案如何用例如MySQL and PHP,但我找不到纯粹的MySQL解决方案。

6 个答案:

答案 0 :(得分:28)

您可以使用json_object将行作为JSON对象获取。

SELECT json_object('name', name, 'phone', phone)
FROM person;

这不会将它们放在数组中,也不会在它们之间加上逗号。你必须在提取它们的代码中这样做。

答案 1 :(得分:25)

新解决方案:

使用您的好评建立,谢谢!

SELECT JSON_ARRAYAGG(JSON_OBJECT('name', name, 'phone', phone)) from Person;

旧解决方案:

在@Schwern的帮助下,我设法提出了这个查询,这似乎有效!

SELECT CONCAT(
    '[', 
    GROUP_CONCAT(JSON_OBJECT('name', name, 'phone', phone)),
    ']'
) 
FROM person;

答案 2 :(得分:5)

如果像我一样坚持使用MySQL 5.6,请尝试以下操作:

SELECT
    CONCAT(
       '[',
       GROUP_CONCAT(
           CONCAT(
               '{"name":"', name, '"',
               ',"phone":"', phone, '"}'
           )
       ),
       ']'
    ) as json
FROM person

答案 3 :(得分:3)

如果您在控制台中运行查询(正如您在其中一条评论中所述),请安装https://github.com/mapnik/mapnik/wiki/OptimizeRenderingWithPostGIS,然后您就可以输出查询'结果为json。

答案 4 :(得分:2)

JSON有两个“分组依据”函数,分别为json_arrayagg和json_objectagg。

此问题可以通过以下方法解决:

SELECT json_arrayagg( json_merge( json_object('name', name), json_object('phone', phone) ) ) FROM person;

这需要MySQL 5.7 +。

答案 5 :(得分:1)

如果您需要嵌套的JSON数组对象,则可以将 JSON_OBJECT json_arrayagg 结合使用,如下所示:

{
    "nome": "Moon",
    "resumo": "This is a resume.",
    "dt_inicial": "2018-09-01",
    "v.dt_final": null,
    "data": [
        {
            "unidade": "unit_1",
            "id_unidade": 9310
        },
        {
            "unidade": "unit_2",
            "id_unidade": 11290
        },
        {
            "unidade": "unit_3",
            "id_unidade": 13544
        },
        {
            "unidade": "unit_4",
            "id_unidade": 13608
        }
    ]
}

你可以这样:

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_lst_caso`(
IN `codigo` int,
IN `cod_base` int)
BEGIN

    DECLARE json TEXT DEFAULT '';

    SELECT JSON_OBJECT(
        'nome', v.nome, 
        'dt_inicial', v.dt_inicial, 
        'v.dt_final', v.dt_final, 
        'resumo', v.resumo,
        'data', ( select json_arrayagg(json_object(
                                'id_unidade',`tb_unidades`.`id_unidade`,
                                'unidade',`tb_unidades`.`unidade`))
                            from tb_caso_unidade
                                INNER JOIN tb_unidades ON tb_caso_unidade.cod_unidade = tb_unidades.id_unidade
                            WHERE tb_caso_unidade.cod_caso = codigo)
    ) INTO json
    FROM v_caso AS v
    WHERE v.codigo = codigo and v.cod_base = cod_base;
    
    SELECT json;
    
END