Twitter の Json を Jackson でパースする

前回の続き。


Spring3 の RestTemplate APITwitter から取得した Json を Jackson を使ってパースする。

前回の pom.xml に Jackson を追加する。

<dependencies>
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-web</artifactId>
	<version>3.0.6.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.codehaus.jackson</groupId>
	<artifactId>jackson-jaxrs</artifactId>
	<version>1.9.3</version>
</dependency>
</dependencies>


続いて、ソースコード


TwitterClientTest.java

package learn;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.codehaus.jackson.annotate.JsonCreator;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;
import org.springframework.web.client.RestTemplate;

public class TwitterClientTest {

	private static final ObjectMapper MAPPER = new ObjectMapper();
	
	public static void main(String[] args) throws IOException {
		
		RestTemplate restTemplate = new RestTemplate();
		String response = restTemplate.getForObject("http://twitter.com/statuses/user_timeline/{user}.json?count={count}", String.class, "stevejobs_bot", "5");
		List<Tweet> tweetList = MAPPER.readValue(response, new TypeReference<ArrayList<Tweet>>() {});
		
		for (Tweet tweet : tweetList) {
			System.out.println("createdAt: " + tweet.getCreatedAt());
			System.out.println("id: " + tweet.getId());
			System.out.println("text: " + tweet.getText());
			System.out.println(" ------ ");
		}
	}
	
	@JsonIgnoreProperties(ignoreUnknown = true)
	public static class Tweet {
		private final String createdAt;
		private final long id;
		private final String text;

		@JsonCreator
		public Tweet(@JsonProperty("created_at") String createdAt, 
				@JsonProperty("id") long id, 
				@JsonProperty("text") String text) {
			this.createdAt = createdAt;
			this.id = id;
			this.text = text;
		}

		public String getCreatedAt() {
			return createdAt;
		}
		
		public long getId() {
			return id;
		}
		
		public String getText() {
			return text;
		}
	}
}


今回は、Json のツイート情報の中から create_at (投稿日時)、id (ステータスID)、text (ツイート本文)だけを取り出す。
これらの情報を Jackson を使って Tweet クラスのオブジェクトにマッピングさせる。
その他の情報は無視するため @JsonIgnoreProperties(ignoreUnknown = true) をつける。
このアノテーションをつけないと UnrecognizedPropertyException が発生した。



実行結果

createdAt: Fri Dec 23 13:45:07 +0000 2011
id: 150210326414106624
text: 平凡なアーティストは模倣する、偉大なアーティストは奪う(ピカソの言葉を引用して)
 ------ 
createdAt: Fri Dec 23 11:45:07 +0000 2011
id: 150180129618919425
text: 二十億ドルの売上と四三〇〇人の社員を抱える大企業が、ジーンズを穿いた六人組と張り合えないなんてバカげている
 ------ 
createdAt: Fri Dec 23 08:45:07 +0000 2011
id: 150134831349633024
text: 当時はわかりませんでしたが、アップルをクビになったことは、私の人生にとってもっとも重要なことだったと今では思います
 ------ 
createdAt: Fri Dec 23 07:45:07 +0000 2011
id: 150119729707761664
text: 今こうして振り返ってみると、あれは人生最良の決断だったと思えます。だって退学した瞬間から興味のない必修科目はもう採る必要がないから、そういうのは止めてしまって、その分もっともっと面白そうなクラスを聴講しにいけるんですからね。
 ------ 
createdAt: Fri Dec 23 03:45:06 +0000 2011
id: 150059329511374848
text: 君たちの時間は限られている。だから自分以外の他の誰かの人生を生きて無駄にする暇なんかない。
 ------ 


参考:
http://jackson.codehaus.org/
http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html