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

ron*_*kot 34 mysql json etl data-conversion

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

SELECT name, phone FROM person;

| name | phone |
| Jack | 12345 |
| John | 23455 |
Run Code Online (Sandbox Code Playgroud)

预期的JSON输出将是

[
  {
    "name": "Jack",
    "phone": 12345
  },
  {
    "name": "John",
    "phone": 23455
  }
]
Run Code Online (Sandbox Code Playgroud)

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

编辑:

有一些答案如何使用例如MySQL和PHP,但我找不到纯MySQL解决方案.

ron*_*kot 41

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

SELECT JSON_ARRAYAGG(JSON_OBJECT('name', name, 'phone', phone)) from Person;
Run Code Online (Sandbox Code Playgroud)

  • 如果你正在使用mysql客户端,[你可以使用`--json`代替](https://dev.mysql.com/doc/refman/5.7/en/mysql-shell-json-output.html)然后它适用于任何查询. (4认同)
  • @DarckBlezzer你命题的输出似乎是一个列表集合:`[{"name":"Jack","phone":"12345"}] [{"name":"John","phone":" 23455"}]`(参见[本例](https://paiza.io/projects/nDa_N94y3O2buGkUVvk55g?language=mysql)) (4认同)
  • 由于 group_concat_max_len /sf/ask/1858767641/,输出可能会被截断 (3认同)
  • 为什么不改用`JSON_ARRAY(JSON_OBJECT('name', name, 'phone', phone))`? (2认同)
  • @DarckBlezzer代替JSON_ARRAYAGG而不是JSON_ARRAY (2认同)
  • @GiacomoAlzetta 它用于 MySQL shell,mysqlsh,与 MySQL 客户端不同。https://dev.mysql.com/doc/mysql-shell/8.0/en/mysqlsh.html#option_mysqlsh_json (2认同)

Sch*_*ern 32

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

SELECT json_object('name', name, 'phone', phone)
FROM person;
Run Code Online (Sandbox Code Playgroud)

这不会将它们放在数组中,也不会在它们之间加上逗号.您必须在获取它们的代码中执行此操作.

  • 我收到此“错误 1305 (42000):FUNCTION mydb.JSON_OBJECT 不存在”错误。如何确保该功能存在? (2认同)
  • @AnthonyKong您使用的是什么版本?json_object只能在5.7及更高版本中使用。 (2认同)
  • 我更喜欢这个而不是选择的“正确”答案,因为它返回每个条目作为它自己的行。这样您就可以将结果流式传输回来。 (2认同)

Bre*_*dan 13

如果你像我一样坚持使用 MySQL 5.6,试试这个:

SELECT
    CONCAT(
       '[',
       GROUP_CONCAT(
           CONCAT(
               '{"name":"', name, '"',
               ',"phone":"', phone, '"}'
           )
       ),
       ']'
    ) as json
FROM person
Run Code Online (Sandbox Code Playgroud)


小智 9

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

这个问题可以通过以下方式解决:

SELECT json_arrayagg(
    json_merge(
          json_object('name', name), 
          json_object('phone', phone)
    )
) FROM person;
Run Code Online (Sandbox Code Playgroud)

这需要 MySQL 5.7+。


Jul*_*sta 8

如果您需要嵌套的 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
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

你也可以这样做:

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
Run Code Online (Sandbox Code Playgroud)