2012年1月8日日曜日

Google App Engine(JSONIC活用)

JSONIC  :   Java 用のJSONエンコーダー/デコーダーライブラリ

POJOをjson形式にしてくれたり逆に, jsonをPOJOにしてくれるライブラリです。
またJSPを使って, JavaScript 出力用に, XSS を防いでくれる出力を作ったりしてくれます。 

WebサービスAPIなんかもあるみたいです。詳しくは JSONIC  です。ダウンロードもここからできます。( 2012/01/08 現在 1.2.8 )

JSONを何で使うかと言いますと, Ajax 通信などで, サーバーのレスポンスをJSONデータで返して,  それをJavaScript で処理するということをやったりします。
今回は, サーバサイド側をやります。

App Engine で外部ライブラリを使用するには,  /war/WEB-INF/lib に .jar を入れます。



そしてJava Build Path に追加します。

テスト用に簡単なサーブレットとデータクラスを用意します。
ex)  JSON を返すサーブレット

package com.atmarkplant.test;



@SuppressWarnings("serial")
public class JsonTestServlet extends HttpServlet 
{

     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
     throws ServletException, IOException 
     { 
           resp.setContentType("application/json; charset=UTF-8");
           BookShelf shelf = new BookShelf( 1, "First");
           JSON.encode(shelf, resp.getOutputStream());
     }
}



package com.atmarkplant.test.bean;

public class BookShelf 
{
     long id;
     String name;
     Date lastmodified;
     
     public BookShelf( long id, String name )
     {
          this.id = id;
          this.name = name;
          this.lastmodified  = new Date();
     }

     public long getId() 
     {
          return id;
     }

     public void setId(long id) 
     {
          this.id = id;
     }

     public String getName() 
     {
          return name;
     }

     public void setName(String name) 
     {
          this.name = name;
     }

     public Date getLastmodified() 
     {
          return lastmodified;
     }

     public void setLastmodified(Date lastmodified) 
     {
          this.lastmodified = lastmodified;
     }
}


Bean クラスには, 少なくとも getterを用意しましょう。

JSONICライブラリの使い方は簡単です。
JSON →  POJO    JSON.decode("文字列", クラス.class); 
POJO  → JSON    JSON.encode(クラスインスタンス);

Format JSONに変更するには
JSON.encode(クラスインスタンス, true);

とします  例外を受け取るときは  JSONException で受け取ります

これを web.xml で追加してテストしてみましょう。
ex) web.xml  にサーブレットを追加


<servlet>
<servlet-name>JSON</servlet-name>
<servlet-class>com.atmarkplant.test.JsonTestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JSON</servlet-name>
<url-pattern>/jsontest</url-pattern>
</servlet-mapping>

webブラウザでテスト  http://localhost:8888/jsontest  にアクセスしましょう。
Chromeでテストした結果が以下になります。


とブラウザ上にJSON形式になったBookShelf クラスのデータがでてきました。
Date型はlong値になったみたいです
次に, もう少し複雑なクラスをテストしてみます。

ex) サーブレット
package com.atmarkplant.test;


@SuppressWarnings("serial")
public class JsonTestServlet extends HttpServlet 
{
     @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
     throws ServletException, IOException 
     {
          resp.setContentType("application/json; charset=UTF-8");
          Book book1 = new Book("App Engine 入門", "1");
          Book book2 = new Book("App Engine 応用", "2");
          List<Book> booklist = new ArrayList<Book>();
          booklist.add(book1);
          booklist.add(book2);
          BookShelf shelf = new BookShelf( 1, "First", booklist );
          JSON.encode(shelf, resp.getOutputStream());
     }
}

ex)  Bean

package com.atmarkplant.test.bean;


public class Book  
{
     String name;
     String isbn;
     public Book( String name, String isbn )
     {
          this.name = name;
          this.isbn = isbn;
     }

     public String getName() 
     {
           return name;
     }

     public void setName(String name) 
     {
          this.name = name;
     }

     public String getIsbn() 
     {
          return isbn;
     }

     public void setIsbn(String isbn) 
     {
          this.isbn = isbn;
     }
}


public class BookShelf 
{
     long id;
     String name;
     Date lastmodified;
     List<Book> books =new ArrayList<Book>();

     public BookShelf( long id, String name, List<Book> booklist )
     {
           this.id = id;
           this.name = name;
           this.books = booklist;
           this.lastmodified  = new Date();
     }

     public long getId() 
     {
           return id;
     }

     public void setId(long id) 
     {
           this.id = id;
     }

     public String getName() 
     {
          return name;
     }

     public void setName(String name) 
     {
          this.name = name;
     }

     public Date getLastmodified() 
     {
          return lastmodified;
     }

     public void setLastmodified(Date lastmodified) 
     {
          this.lastmodified = lastmodified;
     }

     public List<Book> getBooks() 
     {
          return books;
     }

     public void setBooks(List<Book> books) 
     {  
          this.books = books;
     }
}



今度はListを内包したものです。これで確認してみましょう。
こちらも表示されました。[]   をネストして入っているようです。

型の変換表は, JSONICのWebページで公開されています。



































0 件のコメント:

コメントを投稿