ho fatto qualche modifica.
adesso il json risulta così:
codice:
{
  "data" : [ {
    "nome" : "Dance",
    "canzoni" : [ ]
  }, {
    "nome" : "Hardstyle",
    "canzoni" : [ ]
  }, {
    "nome" : "Italiana",
    "canzoni" : [ ]
  }, {
    "nome" : "ND",
    "canzoni" : [ ]
  }, {
    "nome" : "Straniera",
    "canzoni" : [ ]
  } ]
}
più corretto, nel senso che almeno risulta un array, ma cmq vuoto.
questo il codice:
codice:
    router.route("/").handler(routingContext -> {
      HttpServerResponse response = routingContext.response();


      getClient()
        .query("SELECT DISTINCT canzone_genere AS nome FROM canzoni ORDER BY canzone_genere")
        .execute(ar -> {
          RowSet<Row> rowSet = ar.result();
          List<Genere> list = new ArrayList<>();


          for (Row row : rowSet) {
            List<Canzone> list2 = new ArrayList<>();
            JsonObject jsonObject = row.toJson();


            Genere genere = new Genere();
            genere.setNome(jsonObject.getString("nome"));


            String query = String.format("SELECT canzone_titolo AS titolo FROM canzoni WHERE canzone_genere = '%s' ORDER BY canzone_titolo", genere.getNome());


            getClient()
              .query(query)
              .execute(ar2 -> {
                RowSet<Row> rowSet2 = ar2.result();


                for (Row row2 : rowSet2) {
                  JsonObject jsonObject2 = row2.toJson();


                  Canzone canzone = new Canzone();
                  canzone.setTitolo(jsonObject2.getString("titolo"));


                  list2.add(canzone);
                }


                // OK --> STAMPA LE CANZONI
                for (Canzone c : list2) {
                  System.out.println(c.getTitolo());
                }
              });


            // KO --> NON STAMPA LE CANZONI
            for (Canzone c : list2) {
              System.out.println(c.getTitolo());
            }
            genere.setCanzoni(list2);


            list.add(genere);
          }


          JsonObject jsonObject = new JsonObject();
          jsonObject.put("data", list);


          response
            .putHeader("content-type", "application/json; charset=utf-8")
            .end(Json.encodePrettily(jsonObject));
        });
    });
vi ho messo due for.
come vedete il secondo non stampa nulla, come si svuotasse appena uscito dall'execute.