2016-09-23 52 views
1

我正在調查JavaEE 7的JSON處理,並且我有一個如下所述的問題。使用來自JavaEE的JSON處理創建業務對象7

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":"[email protected]","enabled":"Y"} 

2)有相應的JPA實體,稱爲用戶

@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", "[email protected]"); 
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();創建用戶和手動設置所有的屬性,或存在更方便創建用戶的方式?

+0

外部標識與「本地」 ID(主鍵),似乎誤解...... –

回答

0

目前沒有可能使用簡單的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':'[email protected]','enabled':'Y'}"; 
User user = mapper.readValue(jsonString, User.class); 
+0

感謝您的回答!最後我用Jackson2實現了 'ObjectMapper mapper = new ObjectMapper(); User user = mapper.readValue(response.readEntity(InputStream.class),User.class); ' –

0

我認爲你正在尋找的是一個構造函數方法。在你的情況下,你有三個單獨的字段,只要你實例化你的用戶對象就可以填充。

爲了做到這一點這種方法(構造)添加到您的用戶等級:

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

當創建一個類的實例,你將使用下面這行,當然變量替換我的硬盤值:

User user = new User(1141, "[email protected]", "Y"); 

對於直接進入或退出POJO的JSON解析,您可能需要查看一下庫,如Google Gson或Jackson2。

我希望這能回答你的問題!

+0

感謝您的回答!添加構造函數不是問題。但是這個想法「是否有可能在JavaEE 7處理中直接解析爲POJO」(即,不是手動創建新的POJO)我知道Google Gson或Jackson2,但我對JavaEE 7 JSON處理很感興趣。 –