Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como faço para gerar objetos json aninhados usando funções json nativas do mysql?


A razão pela qual você está recebendo esses erros é que o objeto json pai não está esperando um conjunto de resultados como uma de suas entradas, você precisa ter pares de objetos simples como {name, string} etc relatório de bug - pode estar disponível em funcionalidades futuras ... isso significa apenas que você precisa converter seus resultados de várias linhas em uma concatinação de resultados separados por vírgulas e depois convertidos em uma matriz json.

Você quase conseguiu com seu segundo exemplo.

Você pode conseguir o que procura com a função GROUP_CONCAT
select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',json_array(
                     (select GROUP_CONCAT(
                                 json_object('id',id,'parent_id',parent_id,'desc',`desc`)
                             )   
                      from child_table 
                      where parent_id = p.id))
                   )
 from parent_table p;

Isso quase funciona, acaba tratando a subconsulta como uma string que deixa os caracteres de escape lá.
'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [\"
    {\\\"id\\\": 1,
     \\\"desc\\\": \\\"child row 1\\\", 
    \\\"parent_id\\\": 1
    },
    {\\\"id\\\": 2, 
    \\\"desc\\\": \\\"child row 2\\\", 
    \\\"parent_id\\\": 1}\"
    ]
}'

Para que isso funcione em um formato apropriado, você precisa alterar a maneira como cria a saída JSON da seguinte maneira:
select json_object(
  'id',p.id 
 ,'desc',p.`desc`
 ,'child_objects',(select CAST(CONCAT('[',
                GROUP_CONCAT(
                  JSON_OBJECT(
                    'id',id,'parent_id',parent_id,'desc',`desc`)),
                ']')
         AS JSON) from child_table where parent_id = p.id)

 ) from parent_table p;

Isso lhe dará o resultado exato que você precisa:
'{\"id\": 1, 
\"desc\": \"parent row 1\", 
\"child_objects\": 
    [{\"id\": 1, 
    \"desc\": \"child row 1\", 
    \"parent_id\": 1
    }, 
    {\"id\": 2, 
    \"desc\": \"child row 2\", 
    \"parent_id\": 1
    }]  
}'