2011年4月19日 星期二

在 GAE Java application 中使用 Jackson Json 進行 Java object - Json object 轉換

Json 格式一直都算是主流的資料交換格式之一 , 以下分享一下自己在操作 Json - Java 轉換用到的 package 以及相關程式碼的撰寫

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>

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);
  response.setStatus(201);
 }



接下來完成專職處理 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);
    }
  }
}
另外 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 !

沒有留言:

張貼留言