YUKI'S BLOG

HCCソフト社長の日常をたまにお知らせします。

JavaでJSONを制御するサンプルプログラム

2011-09-27 23:17:55 | 技術情報

Javaを使ってJSONをやりとりするサンプルプログラムを作成してみました。JSONライブラリには、Jackson1.8.5を用いています。

(Jacksonダウンロードサイト)

http://wiki.fasterxml.com/JacksonDownload

 

Jacksonを使ったのは、他のライブラリに比べて性能が良さそうだったためです。

(参考にしたベンチマーク)

http://www.pshared.net/diary/20101222.html

 

サンプルプログラムは、Javaで作成したHashMap<String,Object>オブジェクトを一旦JSON文字列に変換し、そのままJavaオブジェクトに戻すというものです。もしかしたら無駄な処理等あるかもしれません。

【実行結果】

 

---- Create JSON Result ----

{"Note":"For JSON TEST","Persons":[{"name":"Abe Taro","age":3,"phone":["XXX-XXXX","YYY-YYYY"]},{"name":"Okawa Hiroyuki","age":41,"phone":["ZZZ-ZZZZ","AAA-AAAA"]}],"Title":"PersonList"}

---- Parse JSON Result ----

Title:PersonList

Note:For JSON TEST

name:Abe Taro

age:3

phone:XXX-XXXX

phone:YYY-YYYY

name:Okawa Hiroyuki

age:41

phone:ZZZ-ZZZZ

phone:AAA-AAAA

【サンプルプログラムのソース】


import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;


public class JacksonTest {
	
	public void test() {
		// JSONに変換するオブジェクトを作成
		Map<String, Object> o = createObject();
		
		// オブジェクトをJSON文字列に変換
		String json = toJSON(o);
		System.out.println("---- Create JSON Result ----");
		System.out.println(json);
		
		// JSON文字列をオブジェクトに戻す
		InputStream is = new ByteArrayInputStream(json.getBytes());
		Map<String, Object> _o = null;
		try {
			_o = parseJSON(is);
		} catch (JsonParseException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// 戻したオブジェクトを確認する
		System.out.println("---- Parse JSON Result ----");
		System.out.println("Title:"+_o.get("Title"));
		System.out.println("Note:"+_o.get("Note"));
		List<Person> persons = (List<Person>)_o.get("Persons");
		for(Person person : persons) {
			System.out.println("name:"+person.name);
			System.out.println("age:"+person.age);
			if(person.phone != null) {
				for(String phone : person.phone) {
					System.out.println("phone:"+phone);
				}
			}
		}
	}
	
	/**
	 * サンプルオブジェクトを生成する
	 * @return
	 */
	private static Map<String, Object> createObject() {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("Title", "PersonList");
		map.put("Note", "For JSON TEST");
		
		List<Person> persons = new ArrayList<Person>();
		Person person1 = new Person();
		person1.name = "Abe Taro";
		person1.age = 3;
		List<String> phone1 = new ArrayList<String>();
		phone1.add("XXX-XXXX");
		phone1.add("YYY-YYYY");
		person1.phone = phone1;
		persons.add(person1);
		
		Person person2 = new Person();
		person2.name = "Okawa Hiroyuki";
		person2.age = 41;
		List<String> phone2 = new ArrayList<String>();
		phone2.add("ZZZ-ZZZZ");
		phone2.add("AAA-AAAA");
		person2.phone = phone2;
		persons.add(person2);
		
		map.put("Persons", persons);
		
		return map;
	}

	/**
	 * オブジェクトからJSON文字列に変換する
	 * @param o
	 * @return
	 */
	private static String toJSON(Map<String, Object> o) {
		
		ObjectMapper objectMapper = new ObjectMapper();
		String jsonString = null;
		
		try {
			jsonString = objectMapper.writeValueAsString(o);
		} catch (JsonGenerationException e) {
			e.printStackTrace();
		} catch (JsonMappingException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return jsonString;
	}
	
	/**
	 * JSON文字列からオブジェクトに変換する
	 * @param is
	 * @return
	 * @throws JsonParseException
	 * @throws IOException
	 */
	private static Map<String, Object> parseJSON(InputStream is) throws JsonParseException, IOException {
		Map<String,Object> o = new HashMap<String,Object>();
		List<Person> persons = null;
		JsonFactory factory = new JsonFactory();
		JsonParser jp = factory.createJsonParser(is);
		if(jp.nextToken() == JsonToken.START_OBJECT) {
			while (jp.nextToken() != JsonToken.END_OBJECT) {
				String _name = jp.getCurrentName();
				jp.nextToken();
				if(_name.equals("Title")) {
					o.put("Title", jp.getText());
				} else if(_name.equals("Note")) {
					o.put("Note", jp.getText());
				} else if(_name.equals("Persons")) {
					persons = parsePersons(jp);
					o.put("Persons", persons);
				} else {
					jp.skipChildren();
				}
			}
		} else {
			jp.skipChildren();
		}
		return o;
	}
	
	private static List<Person> parsePersons(JsonParser jp) throws JsonParseException, NumberFormatException, IOException {
		List<Person> persons = new ArrayList<Person>();
		Person person = null;
		while (jp.nextToken() != JsonToken.END_ARRAY) {
			String _name = jp.getCurrentName();
			if(_name != null) {
				jp.nextToken();
				if(_name.equals("name")) {
					person = new Person();
					persons.add(person);
					person.name = jp.getText();
				} else if(_name.equals("age")) {
					person.age = new Integer(jp.getText());
				} else if(_name.equals("phone")) {
					person.phone = parsePhones(jp);
				} else {
					jp.skipChildren();
				}
			}
		}
		return persons;
	}
	
	private static List<String> parsePhones(JsonParser jp) throws JsonParseException, IOException {
		List<String> phones = new ArrayList<String>();
		while (jp.nextToken() != JsonToken.END_ARRAY) {
			phones.add(jp.getText());
		}
		return phones;
	}
	
	private static class Person {
		public String name;
		public Integer age;
		public List<String> phone;
	}
	
	public static void main(String args[]){
		JacksonTest s = new JacksonTest();
		s.test();
	}

}


Eclipse3.7+Window BuilderでSWT・JFaceのライブラリにビルドパスを通す

2011-09-26 22:12:47 | 技術情報

Eclipse3.7(Indigo)+Window BuilderでSWTを使ったGUIの開発を行うにあたり、SWT・JFaceのライブラリにビルドパスを通す手順です。

1.Eclipseのプロジェクトを選択して右クリック→「Properties」を選択する。

 

 

2.「Java Build Path」を選択し、Libraryタブ→「Add Variable...」を選択する。

 

3.「new Variable Classpath Entry」画面から「Extend...」を選択する。

 

 

4.「Variable Extension」画面から、「org.eclipse.wb.swt_XXXXX.jar」「org.eclipse.jface_YYYYY.jar」を選択して「OK」

 

5.上で指定した2つのJARファイルがビルドパスに追加されるので「OK」

 

(参考URL)

http://www.developer.com/java/other/article.php/3330861/SWT-Programming-with-Eclipse.htm

 

 


秋の一日

2011-09-26 01:08:42 | 日記

子どもが先週行った芳賀町のかしの森公園が楽しかったらしく、

今日も遊んで来ました。

 

 

先週は暑くて大変だったのですが、この1週間で急に秋らしくなりましたね。

さわやかな一日でとてもリフレッシュできました。

 

秋といえば、少し前に庭にいたバッタとこうろぎを家で飼っています。

仲良くきゅうりを食べたりしています。

 

 

夕方のちびまる子ちゃんで、鈴虫を飼っていたら増えてしまい大変なことに

なっていましたが、うちの子どもも、「増えたらどうしよう。。」と言っていました。。

 

 


Eclipse3.7でWindow Builderを使ってみる

2011-09-20 17:29:15 | 技術情報

Eclipse3.7(Indigo)の新機能である、SwingやSWTのGUI画面をWISYWIG開発できる、

Window Builderをインストールしてみました。

1.Eclipseの画面から「Help」→「Install New Software...」を選択

 

2.「Work with:」で「Indigo - http://download.eclipse.org/releases/indigo」 を選択

 

3.「Name」から「General Purpose Tools」のTreeを開き、「Swing Designer」「SWT Designer」のチェック

  をつける。(依存するパッケージは自動的にインストールされます)

 

4.「Next」→「Finish」を選択すると、インストールされます。(私の環境だと、Eclipseの再起動が必要でした)

  次に、既存のSwingで書いたGUIのソースを表示してみました。Javaソースファイルを選択して、右クリック

  →「Open With」→「WindowBuilder Editor」を選択

 

5.エディタ画面の「Design」タブを選択すると、GUIのレイアウト編集画面が表示されます。まだあまりさわって

  いないのですが、今後開発に利用してみたいと思います。

 


かしの森公園

2011-09-18 22:18:10 | 日記

 

今日は9月後半とは思えないような、残暑の厳しい一日でしたね。

 

そのような中、午後、芳賀町のかしの森公園で子供と遊びました。

 

ここは木陰が多いので、こういう暑い日に遊ぶにはいいところです。

 

夏の終わりから秋の始まりって、つくつくぼうしが鳴いて、夕方とか涼しくなって、

 

好きな季節の一つなのですが、今年はまだそんな感じがしないですね。。。