Json Utility Library ( Package ) : 這裡選擇的是 Jackson Json 相當好用!
接下來將分為兩個主要 part , 分別是
1. 透過 maven 新增需要用到的 Jackson pacakge
2. 撰寫 Json 轉 Java 的程式碼
Part 1 :
( 若非 maven in eclipse 的 developer , 可以到 http://wiki.fasterxml.com/JacksonDownload 直接下載 )
在 pom.xml 中加入以下程式片斷
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.7.6</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.7.6</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.7.6</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.7.6</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
Part 2 :
接下來要撰寫 Json to Java 的 Utility 程式
假設我的 GAE application 在接收 POST request 時
會接收到由 web client 傳來的 json format 為 {"id":"1234","text":"this is a message"}
且 application 中的 Message class 包含了兩個對應的 data member , 分別為
形態為 long 的 id , 以及形態為 String 的 text
doPost 的動作流程如下
@Override
protected void doPost(final HttpServletRequest request,final HttpServletResponse response) throws ServletException,
IOException {
if (log.isDebugEnabled()) {
log.debug("doPost");
}
// transfer JSON format to Java Object
Message m = JsonService.deserialize(getRequestBody(request), Message.class);
this.messageRepository.create(m);
this.messageRepository.create(m);
response.setStatus(201);
}
try {
char[] c = new char[1024];
int len;
while ((len = request.getReader().read(c)) != -1) {
sb.append(c, 0, len);
}
} catch (Exception e) {
// error handling
}
return sb.toString();
}
}
接下來完成專職處理 Json 轉換的 Class
主要是透過 Jackson Json 的 ObjectMapper 進行轉換 , 在使用之前 , 需要將 Message 中的相對映 data member 的 gettter 及 setter 都設定好 , 轉換完成後
public class JsonService {
private static final ObjectMapper mapper = new ObjectMapper();
public static <T> T deserialize(String str, Class<T> cls) {
try {
return mapper.readValue(str, cls);
}catch(Exception e) {
throw new JsonServiceException(e);
}
}
}
private static final ObjectMapper mapper = new ObjectMapper();
public static <T> T deserialize(String str, Class<T> cls) {
try {
return mapper.readValue(str, cls);
}catch(Exception e) {
throw new JsonServiceException(e);
}
}
}
另外 getRequestBody() 程式片斷如下
public String getRequestBody(HttpServletRequest request) {
StringBuilder sb = new StringBuilder();try {
char[] c = new char[1024];
int len;
while ((len = request.getReader().read(c)) != -1) {
sb.append(c, 0, len);
}
} catch (Exception e) {
// error handling
}
return sb.toString();
}
上述程式碼將會協助我們轉換由 Client 端發送過來的 Json Object , 變成 Java Object 以便我們儲存到 GAE datastore !
沒有留言:
張貼留言