I would have expected that the following query returns all people with their respective children.
WITH RECURSIVE nested_people (id, name, children) AS (
   SELECT id, name, NULL::JSON AS children
   FROM people
   WHERE parent_id IS NULL
 UNION ALL
   SELECT people.id, people.name, ROW_TO_JSON(nested_people.*) AS children
   FROM people
   JOIN nested_people ON people.parent_id = nested_people.id
)
SELECT * FROM nested_people;
But actually it does the exact reverse. I can't think of a way to do correct nesting without having to an additional CTE. Is there a way?
Example data
+----+-------+-----------+
| id | name  | parent_id |
+----+-------+-----------+
|  1 | Adam  | null      |
|  2 | Abel  | 1         |
|  3 | Cain  | 1         |
|  4 | Enoch | 3         |
+----+-------+-----------+
Result
+----+-------+--------------------------------------------------------------------------+
| id | name  |                                children                                  |
+----+-------+--------------------------------------------------------------------------+
|  1 | Adam  | null                                                                     |
|  2 | Abel  | {"id":1,"name":"Adam","children":null}                                   |
|  3 | Cain  | {"id":1,"name":"Adam","children":null}                                   |
|  4 | Enoch | {"id":3,"name":"Cain","children":{"id":1,"name":"Adam","children":null}} |
+----+-------+--------------------------------------------------------------------------+
Expected Result
+----+-------+----------------------------------------------------------------------------------------------------------------------+
| id | name  |                                                       children                                                       |
+----+-------+----------------------------------------------------------------------------------------------------------------------+
|  1 | Adam  | [{"id":2, "name":"Abel", "children":null},{"id":3,"name":"Cain","children":[{"id":4,"name":"Enoch","children":null}] |
|  2 | Abel  | null                                                                                                                 |
|  3 | Cain  | [{"id":4,"name":"Enoch","children":null}]                                                                            |
|  4 | Enoch | null                                                                                                                 |
+----+-------+----------------------------------------------------------------------------------------------------------------------+
 
     
    