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();
	}

}


最新の画像もっと見る

3 コメント

コメント日が  古い順  |   新しい順
Unknown (iris)
2018-07-21 22:17:27
非常に良いブログと私のfavirouteツールの1つを共有したい。 JSONデータの書式設定と検証のためのhttps://jsonformatter.org
返信する
Unknown (師子乃)
2018-11-06 12:36:11
初めまして。

勉強させていただきます!
返信する
icd 10 erectile (best erectile dysfunction pill)
2020-10-25 22:07:15
erectile winstrol best erectile dysfunction drug are erectile dysfunction not curable

best erectile drug
codozt
ubnjtd
erectile discomfort
fbsnxd
erectile after prostate surgery
xdsrhj
erectile discussion
axtjzq
erectile therapy after prostatectomy
返信する

コメントを投稿