Eclipse のコンソールで入力し、その内容で処理を行うと楽に処理のテストが可能です。画像の水色の部分が入力部分ですが、Enter で、改行コードを含めて入力されます( Windows で \r\n を確認しました )
通常のコマンドプロンプトとの違いは、Enter 後、カーソルが次の入力部分に移動しないところです。ですから、CTRL + END で自分で移動する必要があります。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import com.google.gson.Gson;
public class HttpAndGet {
public static void main(String[] args) {
// コマンドを入力する為の 128 バイトのバッファ
byte[] line = new byte[128];
// コマンド部分を抽出する文字列
String command = "";
int i_len = 0;
// 終了コマンド
while( !(command.toUpperCase().equals("Q")) ) {
try {
// プロンプト出力
System.out.print("java>");
// 入力( 改行付きで入力 )
i_len = System.in.read(line);
} catch (IOException e) {
e.printStackTrace();
}
try {
// 入力内容を文字列に変換して、入力文を取り出す
command = (new String(line, "SJIS")).substring(0, i_len);
// コマンドのみに変換
command = command.trim();
} catch (UnsupportedEncodingException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
// コマンド処理( 大文字小文字を区別しない )
if ( command.toUpperCase().equals("HTTPGET") ) {
HttpGet();
}
// MS932 で判断
if ( command.equals("強制終了") ) {
System.out.print("強制終了します");
System.exit(0);
}
}
System.out.print("プログラムを終了しました");
}
// ******************************************************************
// JSON を インターネットから取得する
// ******************************************************************
public static void HttpGet() {
System.out.println("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();
// http から InputStream を取得する
InputStream i_stream = http.getInputStream();
// InputStream から リーダを作成する( キャラクタセットを指定 )
// UTF-8 でリーダーを作成( インターネット上のデータが UTF-8 なので )
InputStreamReader i_stream_reader = new InputStreamReader(i_stream, "UTF-8");
// リーダを行単位で読み込める BufferedReader を使って全ての文字列を取得する )
BufferedReader buffer_reader = new BufferedReader(i_stream_reader);
json_string = new TextReader().getText(buffer_reader);
// 全て閉じる
buffer_reader.close();
i_stream_reader.close();
i_stream.close();
http.disconnect();
}
catch( Exception e ) {
e.printStackTrace();
json_string = "{ \"winofsql\" : [\"error\"] }";
}
// Gson を作成
Gson gson = new Gson();
// 全体の文字列を JSON_ENTRY クラスに投入
// ( 未定義のものは無視されます )
JSON_ENTRY je = gson.fromJson(json_string,JSON_ENTRY.class);
// 一覧表示
for( int i = 0; i < je.winofsql.length; i++ ) {
System.out.println(je.winofsql[i]);
}
}
// ******************************************************************
// 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;
}
return result_string;
}
}
static class JSON_ENTRY {
String[] winofsql;
}
}
▲ このテストは、JSON の入力と Gson を使った デシリアライズです。
▲ のコードでは、バイナリで読み込んで、new String( buff ) で文字列変換していましたが、以下のコードでは、BufferedReader を使って readLine しています。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
public class NioGet {
public static void main(String[] args) {
// コマンドを入力する為の 128 バイトのバッファ
byte[] line = new byte[128];
// コマンド部分を抽出する文字列
String command = "";
int i_len = 0;
// 終了コマンドは "q"
while( !command.equals("q") ) {
try {
// プロンプト出力
System.out.print("java>");
// 入力
command = (new BufferedReader( new InputStreamReader(System.in, "SJIS") )).readLine();
} catch (IOException e) {
e.printStackTrace();
}
// コマンド処理( 大文字小文字を区別しない )
if ( command.toUpperCase().equals("GET") ) {
JsonGetFromFile();
}
}
System.out.print("プログラムを終了しました");
}
public static void JsonGetFromFile() {
FileSystem fs = FileSystems.getDefault();
byte[] file_dataFiles = null;
Path target = fs.getPath("C:\\user\\lightbox\\java2\\JSON\\sample1\\JsonGet2\\file\\json.txt");
try {
file_dataFiles = Files.readAllBytes(target);
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
String string_file_data = new String(file_dataFiles);
System.out.println(string_file_data);
print_json(string_file_data);
// Gson を作成
Gson gson = new Gson();
// 全体の文字列を JSON_ENTRY クラスに投入
// ( 未定義のものは無視されます )
JSON_ENTRY je = gson.fromJson(string_file_data,JSON_ENTRY.class);
// 固定フォーマットであればこの方法が確実
System.out.println(je.id);
System.out.println(je.description);
System.out.println(je.status.text);
// 存在する場合のみ出力
if ( je.status.abc != null ) {
System.out.println(je.status.abc);
}
}
// デシリアライズ用のクラス
static class JSON_ENTRY {
String id;
String description;
JSON_STATUS status;
}
static class JSON_STATUS {
String text;
String abc;
}
public static void print_json( String json_string ) {
// パーサーを取得
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("【OBJ】-->" );
print_json( value.toString() );
}
else {
if ( value.isJsonNull() ) {
System.out.println("NULL");
}
else {
if ( value.isJsonArray() ) {
JsonArray ja = (JsonArray)value;
System.out.println("【ARRAY】-->" );
print_json_array(ja);
}
else {
System.out.println(value.getAsString());
}
}
}
}
}
public static void print_json_array( JsonArray ja ) {
for( int i = 0; i < ja.size(); i++ ) {
if ( ja.get(i).isJsonObject() ) {
print_json( ja.get(i).toString() );
}
if ( ja.get(i).isJsonNull() ) {
System.out.println("NULL");
}
if ( ja.get(i).isJsonArray() ) {
print_json_array( (JsonArray)ja.get(i) );
}
if ( ja.get(i).isJsonPrimitive() ) {
System.out.println(ja.get(i).getAsString());
}
}
}
}
このテストは、System.nio を使った、ファイルの一括読み込みと、Gson を使った JSON の一覧処理です