Json-lib に手を出す
はてブのAPIがJsonで結果返してくるんで、Json Libsで手を出す。
で、下記のサイトを参考にしたんだけど、一部情報が古い部分、自分で調べなおしが必要な部分があったので、メモ。
JSON/Json-libを使う
http://www.masatom.in/pukiwiki/JSON/Json-lib%A4%F2%BB%C8%A4%A6/
JSON文字列とJavaオブジェクトとの相互変換
http://www.fraction.jp/log/archives/2007/05/1131
Restletとjson-lib を使ったWebサービスへのアクセス
http://www.tkrb.jp/guide/2008/02/restletjsonlib_web.html
目的は、はてブの結果を、Beanに簡単にマッピングすること。
で、対象となるJSONのイメージは下記。
{"count":"190", "bookmarks": [{"comment":" ","timestamp":"2008/08/01 18:00:56","user":"tosuka","tags":[]}, {"comment":" ","timestamp":"2008/07/30 17:06:25","user":"toukai3","tags":[]}, {"comment":"","timestamp":"2008/07/30 17:02:59","user":"asuka44444","tags":[]}, ・・・・・・・・・・・ ] "url":"http://anond.hatelabo.jp/20080727184654", "eid":"9449105", "title":"世間では言えないが", "screenshot":"http://screenshot.hatena.ne.jp/images/120x90/e/8/8/b/f/7e374c40f4911c5357e274afb7d67f86b13.jpg", "entry_url":"http://b.hatena.ne.jp/entry/http://anond.hatelabo.jp/20080727184654"}
マップ先のBeanは下記の感じ。アクセッサーは省略。
public class BookMarkInfo implements Serializable { private String title; private String url; private int count; private String entryUrl; private String screenshot; private String eid; private List<BookMarkDetailOneUserInfo> bookmarks ; } public class BookMarkDetailOneUserInfo implements Serializable { private String user; private Date timestamp; private String[] tags; private String comment; }
で、肝心のマッピングのコード。注意点は、3点。
//はてなのJsonの前後に余分な()が付いているので、それをとって //Jsonのインスタンス化。 JSONObject jsonObject = JSONObject.fromObject(info.str.substring(1) .substring(0, info.str.length() - 2)); //日付書式の指定。かかないと、警告でまくり。 JSONUtils.getMorpherRegistry().registerMorpher( new DateMorpher(new String[] { "yyyy/MM/dd HH:mm:ss" })); JsonConfig config = new JsonConfig(); //ルートとなるクラスの指定と、 //bookmarksの構造体とクラスのマッピング //ClassMapをちゃんとしないと、「MorphDynaBean」 //というダイナミック系?のクラスとして、Bean化されてエラーに・・・・ Map<String, Class> classMap = new HashMap<String, Class>(); classMap.put("bookmarks", BookMarkDetailOneUserInfo.class); config.setClassMap(classMap); config.setRootClass(BookMarkInfo.class); //entry_url⇒entryUrlの変換。 //JSON文字列とJavaオブジェクトとの相互変換からコードは拝借 config.setJavaIdentifierTransformer(new CamelCaseJavaIdentifierTransformer()); //ここで、Bean化 BookMarkInfo bean = (BookMarkInfo) JSONObject .toBean(jsonObject, config);
なれりゃ、簡単っぽいです。