JSPで行こう!

JacksonでのJSONのパース

Google でスケジュール(=イベント)を問い合わせると、JSON形式で情報が返されます。

JSON形式からjavaのオブジェクトへの変換

Jackson ではJSON形式の文字列をDOMとして操作も出来ますが、
決まった要素の配列を扱うような場合、あまり効率的ではありません。
その場合、java のオブジェクトへ変換します。

java はデータ型を動的に定義していく機能はありません(全部Object型にするのはナンセンス)ので、
事前に型を定義しておく必要があります。

JSONの形式は、Google API のドキュメントや、実際に返ってくる文字列を見れば解ります。
一つ重要な点は、場合によって省略される項目や、後で項目が追加された場合に、
Jackson はデフォルトではマッピング出来なかった場合、例外(Exception)を投げます。
これを回避するには、各クラスにアノテーションを指定します。

 @JsonIgnoreProperties(ignoreUnknown=true)

たとえば、カレンダーのイベントについて以下のような情報が返されます。

{
 "kind": "calendar#events",
 "etag": "\"p32cf3769tvctq0g\"",
 "summary": "xxxxxxxx@gmail.com",
 "updated": "2018-09-26T23:56:38.991Z",
 "timeZone": "Asia/Tokyo",
 "accessRole": "owner",
 "defaultReminders": [
  {
   "method": "popup",
   "minutes": 10
  }
 ],
 "nextSyncToken": "CJjnMnv2d0CEJjxnMnv2d0CGAU=",
 "items": [
  {
   "kind": "calendar#event",
   "etag": "\"2653744482000000\"",
   "id": "did5bv3kqv8nicspscb93oipc",
   "status": "confirmed",
   "htmlLink": "https://www.google.com/calendar/event?eid=ZGlkNWJ2M2tjhuOWljc3BzY2I5M29pcGMgYmFiYWppcm91QG0",
   "created": "2012-01-18T07:37:21.000Z",
   "updated": "2012-01-18T07:37:21.000Z",
   "summary": "お仕事",
   "creator": {
    "email": "xxxxxxxx@gmail.com",
    "self": true
   },
   "organizer": {
    "email": "xxxxxxxx@gmail.com",
    "self": true
   },
   "start": {
    "dateTime": "2012-01-18T16:00:00+09:00"
   },
   "end": {
    "dateTime": "2012-01-18T17:00:00+09:00"
   },
   "iCalUID": "di5bv3kv8n9icspscb93oipc@google.com",
   "sequence": 0,
   "reminders": {
    "useDefault": true
   }
  }
 ]
}

これを全部定義するのは面倒です。
必要な情報だけ参照できれば良いのであれば、
例えば、JSP で下記の様に書けます。

<%@ page import="com.fasterxml.jackson.databind.ObjectMapper"%>
<%@ page import="com.fasterxml.jackson.annotation.JsonIgnoreProperties"%>

<%
  ObjectMapper mapper = new ObjectMapper();
  CalendarEvents events = mapper.readValue(body, CalendarEvents.class);
%>

<%!
  // クラス定義
  @JsonIgnoreProperties(ignoreUnknown=true)
  private static class CalendarEvents {
    public List<CalendarItem> items;
    public String nextPageToken;
    public int resultSizeEstimate;
  }

  @JsonIgnoreProperties(ignoreUnknown=true)
  private static class CalendarItem {
    public String id;
    public String summary;
    public DateItem start;
    public DateItem end;
  }

  @JsonIgnoreProperties(ignoreUnknown=true)
  private static class DateItem {
    public String date;
    public String dateTime;
    public String timeZone;
  }

%>

Google の提供ライブラリを使えば、中で正確にオブジェクトに変換してくれます。
逆に言えば使うメリットはそれ位です。
悪く言えば、Googleのライブラリは寄せ集めなので、JDK の特定のバージョンに依存したりしていますので、
後でアップデートするのに苦労すると思ってください。

« 前頁 次頁 »