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 件のコメント:
コメントを投稿