How it works...

First, refer to the loadFromArray() method:

    private void loadFromArray(){
JsonArray array = BUILDERFACTORY.createArrayBuilder()
.add(BUILDERFACTORY.createObjectBuilder()
.add("name", "User1")
.add("email", "user1@eldermoraes.com"))
.add(BUILDERFACTORY.createObjectBuilder()
.add("name", "User2")
.add("email", "user2@eldermoraes.com"))
.add(BUILDERFACTORY.createObjectBuilder()
.add("name", "User3")
.add("email", "user3@eldermoraes.com"))
.build();
fromArray = jsonbBuilder.toJson(array);
}

It uses the BUILDERFACTORY and createArrayBuilder methods to easily build an array of JSONs  objects (each call of createObjectBuilder creates another array member). At the end, we use the Jakarta JSON binding to convert it into a JSON string:

    private void loadFromStructure(){
JsonStructure structure = BUILDERFACTORY.createObjectBuilder()
.add("name", "User1")
.add("email", "user1@eldermoraes.com")
.add("profiles", BUILDERFACTORY.createArrayBuilder()
.add(BUILDERFACTORY.createObjectBuilder()
.add("id", "1")
.add("name", "Profile1"))
.add(BUILDERFACTORY.createObjectBuilder()
.add("id", "2")
.add("name", "Profile2")))
.build();
fromStructure = jsonbBuilder.toJson(structure);

JsonPointer pointer = new JsonPointerImpl("/profiles");
JsonValue value = pointer.getValue(structure);
fromJpointer = value.toString();
}

Here, instead of an array, we are building a single JSON structure. Again, we use Jakarta JSON Binding to convert JsonStructure into a JSON string.

We also took advantage of having this JsonStructure ready and used it to query the user profiles using the JsonPointer object:

private void loadFromUser(){
User user = new User("Elder Moraes", "elder@eldermoraes.com",
new Integer[]{1,2,3});
fromUser = jsonbBuilder.toJson(user);
}

And here was the simplest— creating an object and asking Jakarta JSON Binding to convert it into a JSON string.