我想在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解决方案。
答案 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