SQLの窓

2013年09月07日


google-gson(Java) を使って、JSON を 定義済みクラスのオブジェクトに一括変換する

JSON_ENTRY 内を JSON の内容に合わせて作成しておくだけで、一行の処理で全てセットしてくれます。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

public class HttpAndGet {

	public static void main(String[] args) {

		String http_string = HttpGet();
		System.out.println(http_string);
		
		// Gson を作成
		Gson gson = new Gson();
		
		// 全体の文字列を JSON_ENTRY クラスに投入
		// ( 未定義のものは無視されます )
		JSON_ENTRY je = gson.fromJson(http_string,JSON_ENTRY.class);

		// 一覧表示
		for( int i = 0; i < je.winofsql.length; i++ ) {
			System.out.println(je.winofsql[i]);
		}
	}

	// ******************************************************************
	// JSON を インターネットから取得する
	// ******************************************************************
	public static String HttpGet() {
		String json_string = "";
		
		try {
			// JSON の URL
			URL url = new URL("http://toolbox.winofsql.jp/json/sample2.json");
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			http.setRequestMethod("GET");
			// 接続 
			http.connect();
			
			// UTF-8 でリーダーを作成
			InputStreamReader isr = new InputStreamReader(http.getInputStream(), "UTF-8");
			
			json_string = new TextReader().getText(new BufferedReader(isr)); 
			
			isr.close();
			http.disconnect();
			
		}
		catch( Exception e ) {
			e.printStackTrace();
			json_string = "{ \"winofsql\" : [\"error\"] }";
		}
		
		return json_string;
		
	}

	// ******************************************************************
	// BufferedReader から テキストを取得
	// ******************************************************************
	static class TextReader {
		public String getText(BufferedReader br) throws IOException {

			String result_string = "";
			String line_buffer = null;   
			// BufferedReader は、readLine が null を返すと読み込み終了   
			while ( null != (line_buffer = br.readLine() ) ) {   
				// コマンドプロンプトに表示   
				result_string += line_buffer;
			}
 
			// 閉じる   
			br.close();
			
			return result_string;
		
		}
	}
	
	static class JSON_ENTRY {
		String[] winofsql;
	}

}

関連する記事

VS(C#) : Json.NET を使用して文字列形式の JSON をプログラムで参照する具代的な方法



posted by lightbox at 2013-09-07 16:46 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2013年07月02日


Java : RSS(Document) から、item の中の先頭の指定した要素の値を取得するクラス

XML のフォーマット単位でクラスを作っておいたほうが、なにかと便利のような気がします。機能的に、ノードを XML の文字列に変換する static メソッドを追加しています。

どちらかというと、テスト用なので、java 的なメソッドは無く厳密なエラー処理はせずに問題があれば空文字列を返すようにしています。ですが、可能性として、get メソッドの戻り値が null である場合もあります。
package com.example.a_lightbox;

import java.io.StringWriter;

import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.DOMException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

public class GetRssItemValue {
	
	private Document xml_data = null;
	private Element root = null;
	
	public GetRssItemValue(Document xml_data) {
		this.xml_data = xml_data;
		root = this.xml_data.getDocumentElement();
	}
	
	public String get(String elName) {
		
		String result = "";

		try {
			NodeList node_list = root.getElementsByTagName("item");
			NodeList nl = ((Element)node_list.item(0)).getElementsByTagName(elName);
			result = nl.item(0).getFirstChild().getNodeValue();
		} catch (DOMException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
		
		return result;
	}
	
	public static String getXmlString( Document doc ) {
		
		String xml_string = "";
		try {
			StringWriter sw = new StringWriter();
			TransformerFactory.newInstance().newTransformer().transform(new DOMSource(doc), new StreamResult(sw)); 
			xml_string = sw.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}						

		return xml_string;
	}

}



posted by lightbox at 2013-07-02 17:51 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2012年09月27日


google-gson で、JSON 文字列の構成要素の一覧を取り出す処理

実用の場合は、JSON に対応するクラスを作成してデシリアライズするはずですが、てっとりばやく処理するのならこちらのほうが簡単です。

※ データは、Twitter のデータを使っていますが、Array が無かったのでこのコードでは対応していません。
package winofsql.jp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		System.out.println("開始");
		
		String json_string = "{ \"姓\": \"山田\", \"名\": \"太郎\", \"age\": 53 }";

		test.print_json(json_string,1);

		json_string = "";
		
		try {
			// ターゲット
			URL url = new URL("http://textt.net/sworc/20120924055943.txt");
			// 接続オブジェクト
			HttpURLConnection http = (HttpURLConnection)url.openConnection();
			// GET メソッド 
			http.setRequestMethod("GET");
			// 接続 
			http.connect();
			 
			// EUC-JP でリーダーを作成
			InputStreamReader isr = new InputStreamReader(http.getInputStream(), "UTF-8");   
			// 行単位で読み込む為の準備   
			BufferedReader br = new BufferedReader(isr);   
			String line_buffer;   
			// BufferedReader は、readLine が null を返すと読み込み終了   
			while ( null != (line_buffer = br.readLine() ) ) {   
				// コマンドプロンプトに表示   
				json_string += line_buffer;
			}
 
			// 各々受け持ちクラスを閉じる   
			br.close();
			isr.close();
			http.disconnect();
		}
		catch( Exception e ) {}
		
		System.out.println("★-->");
		test.print_json(json_string,2);
		
	}

	private static void print_json( String json_string, int type ) {
		
		// パーサーを取得
		JsonParser jp = new JsonParser();
		// 文字列をパース
		JsonElement je = jp.parse(json_string);

		// key と value を取得する為に、JsonObject から、entrySet メソッドを実行
		Set<Map.Entry<String, JsonElement>> entrySet = je.getAsJsonObject().entrySet();

		// イテレータを取得
		Iterator<Map.Entry<String, JsonElement>> it = entrySet.iterator();

		// 一覧表示
		while(it.hasNext())
		{
			Map.Entry<String, JsonElement> entry = it.next();

			String key = entry.getKey();
			JsonElement value = entry.getValue();

			System.out.print(key+" : ");
			if ( value.isJsonObject() ) {
				System.out.println("★-->");
				print_json( value.toString(), 2 );
			}
			else {
				if ( value.isJsonNull() ) {
					System.out.println("NULL");
				}
				else {
					System.out.println(value.getAsString());
				}
			}
			// value.toString() だと、個別の文字列の場合 " で挟まれた文字列が取得されました
		}
		
		if ( type == 1 ) {
			// ***************************************
			// メンバ名で値を取得
			// ***************************************
			JsonObject jo = je.getAsJsonObject();
				System.out.println(jo.get("姓").getAsString());
				System.out.println(jo.get("名").getAsString());
				System.out.println(jo.get("age").getAsInt());
		}
		else {
			System.out.println("<--★");
		}

	}


}


▼ 結果

開始
姓 : 山田
名 : 太郎
age : 53
山田
太郎
53
★-->
id : 91500526
profile_background_tile : false
notifications : false
profile_sidebar_fill_color : FFF7CC
location : 大阪府
screen_name : sworc
profile_image_url : http://a0.twimg.com/profile_images/2388651010/zmq5cwm5nsvngpfrtr3f_normal.png
contributors_enabled : false
utc_offset : 32400
time_zone : Osaka
is_translator : false
default_profile : false
profile_background_color : 000000
name : night w?lker
geo_enabled : false
lang : ja
protected : false
profile_background_image_url : http://a0.twimg.com/profile_background_images/59645045/bbs_img_4598c0b36c78d.jpg
id_str : 91500526
listed_count : 6
profile_link_color : FF0000
follow_request_sent : false
description : 絵を描くプログラマ。好きな食べ物は水餃子。手書きブログ。DAZ3D。GIMP。Three.js。フリーフォントで簡単ロゴ作成 http://lightbox.on.coocan.jp/html/fontImage.php http://goo.gl/HDqTM
profile_use_background_image : true
following : false
profile_text_color : 0C3E53
url : http://winofsql.jp/
friends_count : 25
profile_background_image_url_https : https://si0.twimg.com/profile_background_images/59645045/bbs_img_4598c0b36c78d.jpg
created_at : Sat Nov 21 04:24:25 +0000 2009
default_profile_image : false
profile_sidebar_border_color : F2E195
verified : false
status : ★-->
in_reply_to_status_id_str : NULL
geo : NULL
place : NULL
created_at : Sun Sep 23 16:49:33 +0000 2012
in_reply_to_user_id_str : NULL
retweeted : false
in_reply_to_screen_name : NULL
truncated : false
possibly_sensitive_editable : true
possibly_sensitive : false
id_str : 249913404016427008
contributors : NULL
in_reply_to_status_id : NULL
in_reply_to_user_id : NULL
favorited : false
source : <a href="http://winofsql.jp/" rel="nofollow">TwitLink</a>
coordinates : NULL
id : 249913404016427008
retweet_count : 0
text : 家に持ち帰った mdb で簡単に php からアクセスしてテストプログラムを作る( DBクラス付き ) http://t.co/bDzKDGLY
<--★
favourites_count : 1
statuses_count : 6120
profile_image_url_https : https://si0.twimg.com/profile_images/2388651010/zmq5cwm5nsvngpfrtr3f_normal.png
followers_count : 55
<--★




タグ:JSON
posted by lightbox at 2012-09-27 21:20 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2011年10月12日


java : Apache commons-net-3.0.1 を使ってごく自然に FTPS(セキュア) でファイルのアップロード/ダウンロード



ライブラリ全体は、Apache Commons Net™ - Overview よりダウンロードしますが、
ライブラリは同梱しています( commons-net-3.0.1.jar )

FTPClientExample.java というサンプルが付いていましたが、コマンドラインで
実行するサンプルなのでオプション毎に処理が付加されているという解りにくい
ものだったので、必要なものをエラー処理をほとんどせずに記述しています。

※ バイナリとアスキーの違いをテストで確認しています
import java.io.*;
import org.apache.commons.net.ftp.*;

public class Main {

	// *****************************************************
	// エントリポイント
	// *****************************************************
	public static void main(String[] args) {
		Main thisClass = new Main();
	}

	// *****************************************************
	// コンストラクタ
	// *****************************************************
	public Main() {
		super();
		my_acton();
	}

	// *****************************************************
	// 初期処理
	// *****************************************************
	private void my_acton() {

		MyTool out = new MyTool(">>>");
		out.println("処理開始");

		try {

			// FTPS を使っています( FTPClient で通常のクライアントです )
			FTPSClient ftp;
			ftp = new FTPSClient();
			ftp.connect("サーバ");
			ftp.login("ユーザ", "パスワード");
			ftp.enterLocalPassiveMode();

			// テキストアップロード(バイナリ)
			// text.txt は、CRLF で 3バイト => 3バイト
			// サーバーにも CRLF のままでアップロードされるので
			// 問題の出る場合もあります
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			InputStream input1;
			input1 = new FileInputStream(".\\test.txt");
			ftp.storeFile("/home/ユーザ/www/test.txt", input1);
			input1.close();

			// テキストダウンロード(バイナリ)
			// text.txt は、CRLF で 3バイト => 3バイト
			// サーバーの状態のままダウンロードするファイルコピーです
			ftp.setFileType(FTP.BINARY_FILE_TYPE);
			OutputStream output1;
			output1 = new FileOutputStream(".\\test_download.txt");
			ftp.retrieveFile("/home/ユーザ/www/test.txt", output1);
			output1.close();

			// テキストアップロード(ASCII)
			// text.txt は、CRLF で 3バイト => 2バイト
			// Apache サーバでの都合で CRLF は LF に変換されます
			ftp.setFileType(FTP.ASCII_FILE_TYPE);
			InputStream input2;
			input2 = new FileInputStream(".\\test.txt");
			ftp.storeFile("/home/ユーザ/www/test_ascii.txt", input2);
			input2.close();

			// テキストダウンロード(ASCII)
			// text.txt は、CRLF で 2バイト => 3バイト
			// Winodws クライアントの都合で LF は CRLF に変換されます
			ftp.setFileType(FTP.ASCII_FILE_TYPE);
			OutputStream output2;
			output2 = new FileOutputStream(".\\test_download_ascii.txt");
			ftp.retrieveFile("/home/ユーザ/www/test_ascii.txt", output2);
			output2.close();

			// for-each ( 一覧 )
			for (FTPFile f : ftp.listFiles("/home/ユーザ/www")) {
					//System.out.println(f.getRawListing());
					System.out.println(f.toFormattedString());
			}

			//ftp.noop();
			ftp.logout();
			ftp.disconnect();

		}
		catch (Exception e) {
			out.println("エラー");
		}

		out.println("処理終了");

	}

	// *****************************************************
	// 内部用クラス
	// *****************************************************
	private class MyTool {

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			System.out.println( this.mark + str );
		}

	}
}

オリジナルサンプルコード


posted by lightbox at 2011-10-12 21:45 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

2011年09月30日


javamail 1.4.4 : IMAP で、ユーザから別のユーザへメッセージを全て(範囲指定で)コピーする

javamail は こちら(Oracle)からダウンロードします

ダウンロードして解凍すると、サンプルが demo ディレクトリにあります。
その中の copier.java に日本語でコメントを入れてもう少し解りやすく
改造したものです。

サンプルは、URLName で接続していましたが、ユーザ間のコピーのほうが
解りやすいので変更しています。
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.event.*;
import javax.activation.*;

import com.sun.mail.imap.*;

public class Main {

	private MyTool out = new MyTool(">>>");

	// *****************************************************
	// エントリポイント
	// *****************************************************
	public static void main(String[] args) {
		Main thisClass = new Main();
	}

	// *****************************************************
	// コンストラクタ
	// *****************************************************
	public Main() {
		super();
		my_acton();
	}

	// *****************************************************
	// 初期処理
	// *****************************************************
	private void my_acton() {

		out.println("処理開始");

		try {
			Properties props = System.getProperties();
	
			// セッションオブジェクトの取得
			Session session = Session.getInstance(props, null);
			// session.setDebug(true);
	
			// Store オブジェクトの取得
			Store store = session.getStore("imap");
	
			// 接続
			store.connect("サーバー", "ユーザ", "パスワード");

			// 現在のユーザのフォルダオブジェクトを取得
			Folder[] folders = store.getPersonalNamespaces(); 
			for (int index = 0; index < folders.length; index++) { 
				// さくらインターネットでは、INBOX 一つ
				out.println(folders[index].getFullName());
			} 

			// フォルダの存在チェック
			Folder folder = folders[0];		// INBOX
			if (folder == null || !folder.exists()) {
				out.println("Invalid folder");
				System.exit(1);
			}

			// URL の内容を表示
			out.println( folder.getURLName().toString() );

			// フォルダを開く
			folder.open(Folder.READ_WRITE);

			int m_cnt = folder.getMessageCount();

			if (m_cnt == 0) {
				out.println("メッセージが存在しません");
				folder.close(false);	// true では、メッセージは全て削除
				store.close();
				System.exit(0);
			}

			out.println("メッセージ件数 : " + m_cnt);

			Store store2 = session.getStore("imap");
	
			// 別ユーザに接続
			store2.connect("サーバー", "別のユーザ", "別のユーザのパスワード");

			// 別ユーザのフォルダオブジェクト
			Folder[] folders_2 = store2.getPersonalNamespaces(); 
			Folder dfolder = folders_2[0];
			if (!dfolder.exists()) {
				out.println("出力先フォルダが存在しません");
				folder.close(false);
				store.close();
				System.exit(0);
			}

			// コピーするメッセージの範囲を作成
			// Message[] msgs = folder.getMessages(2, 4); // 範囲指定
			Message[] msgs = folder.getMessages();	// 全てのメッセージ

			// メッセージのコピー
			folder.copyMessages(msgs, dfolder);

			folder.close(false);
			store.close();

		} catch (Exception ex) {
			ex.printStackTrace();
		}

		out.println("処理終了");


	}

	// *****************************************************
	// 内部用クラス
	// *****************************************************
	private class MyTool {

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			System.out.println( this.mark + str );
		}

	}

}

メッセージの取得には、単一メッセージの取得もあります。


posted by lightbox at 2011-09-30 21:17 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする

javamail 1.4.4 : IMAP のメール受信イベントでメールを受け取ったら処理を行う

javamail は こちら(Oracle)からダウンロードします

ダウンロードして解凍すると、サンプルが demo ディレクトリにあります。
その中の monitor.java に日本語でコメントを入れてもう少し解りやすく
改造したものです
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.event.*;
import javax.activation.*;

import com.sun.mail.imap.*;

public class Main {

	private MyTool out = new MyTool(">>>");

	// *****************************************************
	// エントリポイント
	// *****************************************************
	public static void main(String[] args) {
		Main thisClass = new Main();
	}

	// *****************************************************
	// コンストラクタ
	// *****************************************************
	public Main() {
		super();
		my_acton();
	}

	// *****************************************************
	// 初期処理
	// *****************************************************
	private void my_acton() {

		out.println("処理開始");

		try {
			Properties props = System.getProperties();
	
			// セッションオブジェクトの取得
			Session session = Session.getInstance(props, null);
			// session.setDebug(true);
	
			// Store オブジェクトの取得
			Store store = session.getStore("imap");
	
			// 接続
			store.connect("サーバー", "ユーザー", "パスワード");

			// 現在のユーザのフォルダオブジェクトを取得
			Folder[] folders = store.getPersonalNamespaces(); 
			for (int index = 0; index < folders.length; index++) { 
				// さくらインターネットでは、INBOX 一つ
				out.println(folders[index].getFullName());
			} 

			// フォルダの存在チェック
			Folder folder = folders[0];		// INBOX
			if (folder == null || !folder.exists()) {
				out.println("Invalid folder");
				System.exit(1);
			}

			// URL の内容を表示
			out.println( folder.getURLName().toString() );

			// フォルダを開く
			folder.open(Folder.READ_WRITE);

			// 新しいメールを受信すると呼び出されるイベントの登録
			folder.addMessageCountListener(new MessageCountAdapter() {
				public void messagesAdded(MessageCountEvent ev) {
					Message[] msgs = ev.getMessages();
					out.println(msgs.length + "件の新しいメッセージを取得しました");
		
					// メーセージ内容の表示
					for (int i = 0; i < msgs.length; i++) {
						try {
							out.println("-----");
							out.println("Message " + msgs[i].getMessageNumber() + ":");
							// メッセージをコンソールに書き込み
							msgs[i].writeTo(System.out);
						} catch (IOException ioex) { 
							ioex.printStackTrace();	
						} catch (MessagingException mex) {
							mex.printStackTrace();
						}
					}
				}
			});

			// メッセージ待ち処理
			int freq = 5000;	// idle できない場合の、スリープ間隔(ミリ秒)
			boolean supportsIdle = false;
			try {
				if (folder instanceof IMAPFolder) {
					IMAPFolder f = (IMAPFolder)folder;
					out.println("IDLE を開始します");
					f.idle();
					supportsIdle = true;
				}
			} catch (FolderClosedException fex) {
				throw fex;
			} catch (MessagingException mex) {
				supportsIdle = false;
			}

			// IDLE がサポートされていない場合の処理と、それと同時に
			// メッセージを受け取って、IDLE が一旦終了された時の為の継続ループ処理
			while (true) {
				if (supportsIdle && folder instanceof IMAPFolder) {
					out.println("IDLE 中です");
					IMAPFolder f = (IMAPFolder)folder;
					f.idle();
				}
				else {
					out.println("sleep します");
					Thread.sleep(freq);
		
					// イベントを起動する為にこちらから呼び出し処理
					folder.getMessageCount();
				}
			}
	
		} catch (Exception ex) {
			ex.printStackTrace();
		}

	}

	// *****************************************************
	// 内部用クラス
	// *****************************************************
	private class MyTool {

		private String mark = null;

		MyTool(String pm) {
			mark = pm;
		}

		public void println(String str) {
			System.out.println( this.mark + str );
		}

	}

}

idle メソッドによって、メーッセージ受信待ちになるので、終了する時は
CTRL+C で終了します。

Thread.sleep する事はまず無いと思いますが、サンプルでは古い環境でも
動くようにと付加されていたのだと思います。


posted by lightbox at 2011-09-30 14:06 | java : 通信関連 | このブログの読者になる | 更新情報をチェックする
Seesaa の各ページの表示について
Seesaa の 記事がたまに全く表示されない場合があります。その場合は、設定> 詳細設定> ブログ設定 で 最新の情報に更新の『実行ボタン』で記事やアーカイブが最新にビルドされます。

Seesaa のページで、アーカイブとタグページは要注意です。タグページはコンテンツが全く無い状態になりますし、アーカイブページも歯抜けページはコンテンツが存在しないのにページが表示されてしまいます。

また、カテゴリページもそういう意味では完全ではありません。『カテゴリID-番号』というフォーマットで表示されるページですが、実際存在するより大きな番号でも表示されてしまいます。

※ インデックスページのみ、実際の記事数を超えたページを指定しても最後のページが表示されるようです

対処としては、このようなヘルプ的な情報を固定でページの最後に表示するようにするといいでしょう。具体的には、メインの記事コンテンツの下に『自由形式』を追加し、アーカイブとカテゴリページでのみ表示するように設定し、コンテンツを用意するといいと思います。


※ エキスパートモードで表示しています

アーカイブとカテゴリページはこのように簡単に設定できますが、タグページは HTML 設定を直接変更して、以下の『タグページでのみ表示される内容』の記述方法で設定する必要があります

<% if:page_name eq 'archive' -%>
アーカイブページでのみ表示される内容
<% /if %>

<% if:page_name eq 'category' -%>
カテゴリページでのみ表示される内容
<% /if %>

<% if:page_name eq 'tag' -%>
タグページでのみ表示される内容
<% /if %>
この記述は、以下の場所で使用します
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり