如何使用 Jersey 将 Java object 的特定属性序列化为 JSON?
How to serialize specific attributes of the Java object to JSON with Jersey?
我正在使用 Jersey 框架创建 Rest API。 API 为骑手创建一个帐户,driver 为共享乘车应用程序创建一个帐户。这是我的项目的依赖项。
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<!-- use the following artifactId if you don't need servlet 2.x compatibility -->
<!-- artifactId>jersey-container-servlet</artifactId -->
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-binding</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20190722</version>
</dependency>
</dependencies>
我在将 Java Object "User"(包含 driver 发布的游乐设施的所有信息)序列化为 [=33= 时遇到问题] object 因为我只想将特定属性转换回 JSON。这是我的 "User" class 属性:
private String first_name;
private String last_name;
private String phone;
private String picture;
private boolean is_active;
private int aid;
private List<Rating> drivers_rating;
private List<Rating> riders_rating;
但是,当我执行 GET 请求以获取车手评级时,我只希望 JSON 响应包含 "first_name, phone, and drivers_rating"。这是我尝试过的:
@Path("{aid}/driver")
@GET
@Produces(MediaType.APPLICATION_JSON)
public User viewDriverRatings(@PathParam("aid") int aid) {
return repo.viewDriverRatings(aid);
}
但是,return 是具有所有属性的 JSON 响应。我应该怎么做才能将 return 特定属性转换为 JSON?
如果确实需要限制列。多种选择供您选择。
1. 为此受限制的可见性创建另一个 class,包含 "first_name, phone, and drivers_rating"。这在设计方面会更好。
2.可以使用transient。这不是好的设计,因为这将禁止整个 class 对象也使用这些属性序列化以用于任何其他功能。
我不建议限制在 JSON 级别。那将是一个糟糕的设计。
我同意 Nilotpal 的回复。我见过这样的情况,其中响应可以包含比特定资源请求更多的信息。我看到代码中有单独的 classes 用于请求和响应。在您的情况下,您可以创建一个 UserReponse class,它将包含您想要 return 用于 GET 事务的所有字段。同样,对于 POST 工作流,您可以有一个 UserRequest class,其中包含消费者可以在请求正文中发送的字段,
我正在使用 Jersey 框架创建 Rest API。 API 为骑手创建一个帐户,driver 为共享乘车应用程序创建一个帐户。这是我的项目的依赖项。
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<!-- use the following artifactId if you don't need servlet 2.x compatibility -->
<!-- artifactId>jersey-container-servlet</artifactId -->
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-binding</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20190722</version>
</dependency>
</dependencies>
我在将 Java Object "User"(包含 driver 发布的游乐设施的所有信息)序列化为 [=33= 时遇到问题] object 因为我只想将特定属性转换回 JSON。这是我的 "User" class 属性:
private String first_name;
private String last_name;
private String phone;
private String picture;
private boolean is_active;
private int aid;
private List<Rating> drivers_rating;
private List<Rating> riders_rating;
但是,当我执行 GET 请求以获取车手评级时,我只希望 JSON 响应包含 "first_name, phone, and drivers_rating"。这是我尝试过的:
@Path("{aid}/driver")
@GET
@Produces(MediaType.APPLICATION_JSON)
public User viewDriverRatings(@PathParam("aid") int aid) {
return repo.viewDriverRatings(aid);
}
但是,return 是具有所有属性的 JSON 响应。我应该怎么做才能将 return 特定属性转换为 JSON?
如果确实需要限制列。多种选择供您选择。 1. 为此受限制的可见性创建另一个 class,包含 "first_name, phone, and drivers_rating"。这在设计方面会更好。 2.可以使用transient。这不是好的设计,因为这将禁止整个 class 对象也使用这些属性序列化以用于任何其他功能。
我不建议限制在 JSON 级别。那将是一个糟糕的设计。
我同意 Nilotpal 的回复。我见过这样的情况,其中响应可以包含比特定资源请求更多的信息。我看到代码中有单独的 classes 用于请求和响应。在您的情况下,您可以创建一个 UserReponse class,它将包含您想要 return 用于 GET 事务的所有字段。同样,对于 POST 工作流,您可以有一个 UserRequest class,其中包含消费者可以在请求正文中发送的字段,