Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso generare oggetti json nidificati usando le funzioni json native di mysql?

Il motivo per cui ricevi questi errori è che l'oggetto json padre non si aspetta un set di risultati come uno dei suoi input, devi avere coppie di oggetti semplici come {name, string} ecc segnalazione di bug - potrebbe essere disponibile in funzionalità future ... questo significa solo che devi convertire i risultati su più righe in una concatenazione di risultati separati da virgole e quindi convertiti in un array json.

L'hai quasi fatto con il tuo secondo esempio.

Puoi ottenere ciò che cerchi con la funzione 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;

Funziona quasi, finisce per trattare la sottoquery come una stringa che lascia i caratteri di escape lì dentro.

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

Per farlo funzionare in un formato appropriato, devi modificare il modo in cui crei l'output JSON come segue:

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;

Questo ti darà il risultato esatto di cui hai bisogno:

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