Google でスケジュール(=イベント)を問い合わせると、JSON形式で情報が返されます。
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 の特定のバージョンに依存したりしていますので、
後でアップデートするのに苦労すると思ってください。
| « 前頁 | 次頁 » |