sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo genero objetos json anidados usando funciones json nativas de mysql?

La razón por la que recibe estos errores es que el objeto json principal no espera un conjunto de resultados como una de sus entradas, debe tener pares de objetos simples como {nombre, cadena}, etc. informe de errores:puede estar disponible en funciones futuras ... esto solo significa que necesita convertir sus resultados de múltiples filas en una concatenación de resultados separados por comas y luego convertidos en una matriz json.

Casi lo tienes con tu segundo ejemplo.

Puede lograr lo que busca con la función 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;

Esto casi funciona, termina tratando la subconsulta como una cadena que deja los caracteres de escape allí.

'{\"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 esto funcione en un formato apropiado, debe cambiar la forma en que crea la salida JSON de la siguiente manera:

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;

Esto le dará el resultado exacto que necesita:

'{\"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
    }]  
}'