【问题标题】:Create business object using JSON processing from JavaEE 7使用 JavaEE 7 中的 JSON 处理创建业务对象
【发布时间】:2016-09-23 17:23:55
【问题描述】:

我正在研究 JavaEE 7 的 JSON 处理,我有一个问题描述如下。

(在询问之前我已阅读以下信息但仍有疑问)

http://docs.oracle.com/javaee/7/tutorial/jsonp004.htm

How can I cast a JSONObject to a custom Java class?

How do I convert a JSONObject to class object?

1) 我有一个 REST Web 服务,它以 JSON 格式返回响应:

{"id":1141,"email":"user@organisation.com","enabled":"Y"}

2) 有一个对应的 JPA Entity 叫做 User

@Table(name = "USER")
@Entity
public class User {

@Id
@Column(name = "USER_ID")
private Long id;

@Column(name = "EMAIL")
private String email;

@Column(name = "ENABLED")
private String enabled;

3) 我有一个基于 Jersey 客户端 API 和 Java EE JSON 处理的客户端,它们调用此 Web 服务。

Maven 依赖:

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.22.1</version>
    <scope>provided</scope>
</dependency>

<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.0.4</version>
</dependency>

客户端代码:

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:7001/projectname/rest");
WebTarget resourceWebTarget = target.path("users").queryParam("email", "user@organisation.com");
Invocation.Builder invocationBuilder = resourceWebTarget.request(MediaType.APPLICATION_JSON);
Response response = invocationBuilder.get();

JsonReader reader = Json.createReader(response.readEntity(InputStream.class));           
JsonObject jObject = reader.readObject();

User user = new User();
user.setId(jObject.getJsonNumber("id").longValue());
user.setEmail(jObject.getString("email"));
user.setEnabled(jObject.getString("enabled"));

最后是问题:

我应该创建像User = new User(); 这样的用户并手动设置所有属性还是存在更方便的方式来创建用户?

【问题讨论】:

  • 外部 ID 与“本地”ID(主键)似乎是一种误解......

标签: java json rest java-ee-7


【解决方案1】:

目前无法使用简单的javax.json-api 进行直接映射 如果您使用 Jersey Client API,最好使用 Jackson 映射器。

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.23.2</version>
    <scope>provided</scope>
</dependency>

你可以使用这样简单的构造:

String jsonString = "{'id':1141,'email':'user@organisation.com','enabled':'Y'}";
User user = mapper.readValue(jsonString, User.class);

【讨论】:

  • 感谢您的回答!终于用Jackson2实现了ObjectMapper mapper = new ObjectMapper(); User user = mapper.readValue(response.readEntity(InputStream.class), User.class);
【解决方案2】:

我认为您正在寻找的是构造方法。在您的用户情况下,您有三个单独的字段,可以在您实例化用户对象后立即填充。

为此,将此方法(构造函数)添加到您的 User 类中:

public User(Long id, String email, String enabled){
   this.id = id;
   this.email = email;
   this.enabled = enabled;
}

在创建类的实例时,您将使用以下行来用我的硬值代替变量:

User user = new User(1141, "user@organisation.com", "Y");

对于直接将 JSON 解析到 POJO 或从 POJO 中解析出来,您可能需要考虑使用诸如 Google Gson 或 Jackson2 之类的库。

我希望这能回答你的问题!

【讨论】:

  • 感谢您的回答!添加构造函数不是问题。但是“在 JavaEE 7 处理中是否可以直接解析到 POJO”的想法(即不手动创建新的 POJO)我知道 Google Gson 或 Jackson2,但我对 JavaEE 7 JSON 处理很感兴趣。
【解决方案3】:

随着 Java EE 8 中 JSON 绑定的发布,您现在可以将 JSON 绑定到 Java 对象。

这是一个简单的例子:

String userJson = "{\"id\":1141,
                    \"email\":\"user@organisation.com\",
                    \"enabled\":\"Y\"}";
User user = JsonbBuilder.create().fromJson(userJson, User.class);

不再需要依赖第三方 API。 JSON 处理和 JSON 绑定一起工作并集成到 JAX-RS API 中。

因此您可以将上面的代码示例调整为以下内容:

User user = JsonbBuilder.create()
              .fromJson(response.readEntity(InputStream.class), User.class);

JSON-B deserialization process can be customized 以各种非常方便的方式使用简单的注释或运行时配置以及高级较低的自定义选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2013-08-17
    相关资源
    最近更新 更多