如何在 Java EE 7 的 JAX-RS 层中获取 Java 对象的 JSON 表示?

bra*_*orm 2 json gson java-ee-7 jsonobject jakarta-ee

我们目前使用的是 Java EE 5,我们在发送响应之前执行以下操作将 POJO 转换为 JSON。

    @GET
    @Path("/books")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getBooks()  {
    List<Book> listOfBooks = getMiscService().getbooks();
    String response = "{\"books\":" + gson.toJson(listOfBooks) + "}";               
    return Response.status(Response.Status.OK).entity(response).build();
    }
Run Code Online (Sandbox Code Playgroud)

我们正在使用谷歌的 gson API。现在我们正在将代码重组为符合 Java EE 7 API 的,我想知道是否有任何 JSON 转换 API 可以将 POJO 转换为 JSON。

我知道 Java EE 7 中引入的 JsonObject API。但我仍然想知道如何获得我的 POJO 的 JSON 表示。

JsonObject jsonObject = Json.createObjectBuilder().add("books", myObject);
Run Code Online (Sandbox Code Playgroud)

上面的 myObject 需要是我的对象的 JSON 表示正确吗?

我正在考虑这个。但这仍然使用 Gson

JsonObject jsonObject = Json.createObjectBuilder().add("books", gson.toJson(myObject));
Run Code Online (Sandbox Code Playgroud)

这里推荐的方式是什么?

谢谢

Nik*_*los 5

JAX-RS 会将您的对象转换为 JSON,无需手动执行。即,以下代码:

@GET
@Path("/books")
@Produces(MediaType.APPLICATION_JSON)
public Response getBooks()  {
    List<Book> listOfBooks = getMiscService().getbooks();
    return Response.status(Response.Status.OK).entity(listOfBooks).build();
}
Run Code Online (Sandbox Code Playgroud)

...将产生一个 JSON,如:

[
    { "title": "Book1", "author": "Foo", ... },
    { "title": "Book2", "author": "Bar", ... },
    ...
]
Run Code Online (Sandbox Code Playgroud)

如果你想要一个books包装器,只需制作一个 bean:

public class BooksWrapper {
    private List<Book> books;
    public BooksWrapper(List<Book> books) {
        this.books = books;
    }
    public List<Book> getBooks() {
        return books;
    }
}
Run Code Online (Sandbox Code Playgroud)

并将 REST 方法转换为返回此类型:

@GET
@Path("/books")
@Produces(MediaType.APPLICATION_JSON)
public Response getBooks()  {
    List<Book> listOfBooks = getMiscService().getbooks();
    BooksWrapper result = new BooksWrapper(listOfBooks);
    return Response.status(Response.Status.OK).entity(result).build();
}
Run Code Online (Sandbox Code Playgroud)