SQLの窓 イラストAC フリー素材

2015年06月15日

Google Gson の fromJson が、配列でも ArrayList でも同等に扱ってくれる事のテスト

なんとなくできるんだろうなぁ、と思いながらも試した事は無かったのですが、普通にできました。テストはコンソールでやっていますが、本来は Android で ArrayAdapter とセットで使用するので、どちらでもあまり大差はありません。

というより、Google Gson で文字列 JSON がほぼストレートに ListView にセットされるところが最も素敵なところです。
import java.util.ArrayList;
import java.util.ListIterator;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;


public class Main {

	// Livedoor の お天気Webサービス用 (JSON用)
	class Weather {
		// ArrayList で定義
		ArrayList<PinpointLocation> pinpointLocations;
	}
	class Weather2 {
		// 配列で定義
		PinpointLocation[] pinpointLocations;
	}

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ

		System.out.println("開始");

		// データをセット
		String result = Tools.httpGet(
			"http://weather.livedoor.com/forecast/webservice/json/v1?city=270000",
			"utf-8",
			null
		);

		System.out.println(result);

		Gson gson = new Gson();

		// ArrayList として処理
		Weather weatherData = gson.fromJson(result, Weather.class);

		// 多いので40番目から
		ListIterator<PinpointLocation> li = weatherData.pinpointLocations.listIterator(39);
		while(li.hasNext()) {
			PinpointLocation data = li.next();
			System.out.println(data.name + " : " + data.link );
		}

		System.out.println("-----------------------------------------");

		// 配列
		Weather2 weatherData2 = gson.fromJson(result, Weather2.class);

		// 多いので40番目から
		for( int i = 39; i < weatherData2.pinpointLocations.length; i++ ) {
			PinpointLocation data = weatherData2.pinpointLocations[i];
			System.out.println(data.name + " : " + data.link );
		}

		// 多いので40番目から( 39 番までを削除 )
		for( int i = 38; i >= 0; i-- ) {
			weatherData.pinpointLocations.remove(i);
		}
		
		Gson gsonPretty = new GsonBuilder().setPrettyPrinting().create();
		String json1 = gsonPretty.toJson(weatherData);
		System.out.println( json1 );

	}

}


後重要なのは、逆の toJson ですが、この場合は整形する方法があるので、ここも重要です。
Gson prettyGson = new GsonBuilder().setPrettyPrinting().create();
String json = prettyGson.toJson(weatherData);


Web アクセス用簡易 static クラス
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;


public class Tools {

	// 指定した URL へ 任意の charset で処理
	public static String httpGet( String targetUrl,String targetCharset,Map<String,String> params) {

		StringBuffer web_data = new StringBuffer();

		try {
			// Query String の作成( 必要無ければ引数を null とする )
			String data = "";
			if ( params != null ) {
				Iterator<String> it =  params.keySet().iterator();
				String key = null;
				String value = null;
				while(it.hasNext()) {
					key = it.next().toString();
					value = params.get(key);
					if ( !data.equals("") ) {
						data += "&";
					}
					data += key + "=" + URLEncoder.encode(value, targetCharset) ;
				}
				if ( !data.equals("") ) {
					targetUrl = targetUrl + "?" + data;
				}
			}

			// **********************************************
			// インターネットへの接続
			// **********************************************
			// 読み込む WEB上のターゲット
			URL url = new URL(targetUrl);
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド
			http.setRequestMethod("GET");
			// 接続
			http.connect();

			// **********************************************
			// ストリームとして読み込む準備
			// **********************************************
			// 以下読み込み3点セット InputStream / InputStreamReader / BufferedReader
			InputStream input_stream = http.getInputStream();
			// UTF-8 でリーダーを作成
			InputStreamReader input_stream_reader = new InputStreamReader(input_stream, targetCharset);
			// 行単位で読み込む為の準備
			BufferedReader buffered_reader = new BufferedReader(input_stream_reader);

			// **********************************************
			// 行の一括読み込み
			// **********************************************
			String line_buffer = null;
			// BufferedReader は、readLine が null を返すと読み込み終了
			while ( null != (line_buffer = buffered_reader.readLine() ) ) {
				web_data.append( line_buffer );
				web_data.append( "\n" );
			}

			// **********************************************
			// 接続解除
			// **********************************************
			http.disconnect();
		}
		catch(Exception e) {
			// 失敗
			System.out.println(e.getMessage());
		}
		return web_data.toString();
	}
}



タグ:JSON
【Javaの最新記事】
posted by at 2015-06-15 20:58 | Java | このブログの読者になる | 更新情報をチェックする