Json-lib に手を出す

はてブAPIJsonで結果返してくるんで、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点。

  1. 日付書式の指定
  2. ClassとJsonマッピング
  3. JavaIdentifierTransformerのプロパティ名の補正
//はてなの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);


なれりゃ、簡単っぽいです。