Причината да получавате тези грешки е, че родителският json обект не очаква набор от резултати като един от входните си данни, трябва да имате прости двойки обекти като {name, string} и т.н. отчет за грешка - може да бъде наличен в бъдеща функционалност ... това просто означава, че трябва да конвертирате вашите многоредови резултати в конкатинация на резултати, разделени със запетаи и след това преобразувани в json масив.
Почти го разбрахте с втория си пример.
Можете да постигнете това, което търсите с функцията 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;
Това почти работи, в крайна сметка третира подзаявката като низ, който оставя escape знаците там.
'{\"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}\"
]
}'
За да накарате това да работи в подходящ формат, трябва да промените начина, по който създавате JSON изхода, както следва:
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;
Това ще ви даде точния резултат, от който се нуждаете:
'{\"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
}]
}'