SQLの窓

2017年05月25日


Java で JSON 文字列を オブジェクトに変換する Google Gson の基本 4 パターン

ほぼ Google Gson のユーザガイドに記述されている内容です。
一般 JSON オブジェクトフォーマット

JSON 文字列のルートがいきなり、 JSON オブジェクトの一般プロパティになっている場合です。
{
    "link": "http://www.yahoo.co.jp/",
    "name": "Yahoo! JAPAN"
}
一番使う事の多いパターンの基本で、そのフォーマットのクラス定義を作成して、Gson に展開してもらいます。 一般 配列フォーマット JSON 文字列のルートがいきなり、 JSON オブジェクトの配列になっている場合で、データとしては特殊な部類になります。
[
    "http://www.yahoo.co.jp/",
    "Yahoo! JAPAN"
]
ですが、Gson 側では以下のように比較的簡単に扱えます String[] data = gson.fromJson(json, String[].class); また、これは Java での作業の都合で、ArrayList に変更する事も可能です。(但し、少し面倒です) Type arrayListType = new TypeToken<ArrayList<String>>(){}.getType(); ArrayList<String> al = gson.fromJson(json, arrayListType); 配列の中のデータ毎に型が違うフォーマット
[
    "サイトデータ",
    1,
    {
        "link": "http://www.yahoo.co.jp/",
        "name": "Yahoo! JAPAN"
    }
]
このタイプが一番面倒です。通常使われる事は無いと思いますが、使用する場合は一つ一つ対応する事になると思います。( Gson でのオリジルサンプルコードはここにあります ) オブジェクト内にオブジェクト配列
{
    "title": "サイトデータ",
    "number": 2,
    "urlList": [
        {
            "link": "http://www.yahoo.co.jp/",
            "name": "Yahoo! JAPAN"
        },
        {
            "link": "https://www.google.co.jp/",
            "name": "Google"
        }
    ]
}
データフォーマットとしてはこれが一番優れており、全てクラスを定義する事によって容易に対応できます。
import java.lang.reflect.Type;
import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;


public class Main {

	// メンバ用クラス
	class LinkFormat {
		String link;
		String name;
	}
	
	// メンバに配列
	class SiteData {
		String title;
		int number;
		
		LinkFormat[] urlList;
	}
	
	// メンバに ArrayList
	class SiteDataList {
		String title;
		int number;
		
		ArrayList <LinkFormat> urlList;
	}
		
	public static void main(String[] args) {
	
		String json = null;
		
		// 一般 JSON オブジェクトフォーマット
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "{";
		json += 	"\"link\":\"http://www.yahoo.co.jp/\",";
		json += 	"\"name\":\"Yahoo! JAPAN\"";
		json += "}";
		System.out.println(json);

		Gson gson = new Gson();

		// オブジェクトに変換
		System.out.println("-----------------------------------------");
		
		LinkFormat linkFormat = gson.fromJson(json, LinkFormat.class);

		System.out.println(linkFormat.link);
		System.out.println(linkFormat.name);

		// 一般 配列フォーマット
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "[";
		json += 	"\"http://www.yahoo.co.jp/\",";
		json += 	"\"Yahoo! JAPAN\"";
		json += "]";
		System.out.println(json);

		// 配列に変換
		String[]  data = gson.fromJson(json, String[].class);

		System.out.println(data[0]);
		System.out.println(data[1]);

		// ArrayListに変換
		System.out.println("-----------------------------------------");
		
		Type arrayListType = new TypeToken<ArrayList<String>>(){}.getType();
		ArrayList<String>  al = gson.fromJson(json, arrayListType);

		System.out.println(al.get(0));
		System.out.println(al.get(1));

		// 特殊 JSON オブジェクト配列フォーマット
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "[";
		json += 	"\"サイトデータ\",";
		json += 	"1,";
		json += 	"{";
		json += 		"\"link\":\"http://www.yahoo.co.jp/\",";
		json += 		"\"name\":\"Yahoo! JAPAN\"";
		json += 	"}";
		json += "]";
		System.out.println(json);

		// JSON 文字列配列内の型が違う場合はひとつひとつ対応
		JsonParser parser = new JsonParser();
		JsonArray array = parser.parse(json).getAsJsonArray();
		String title = gson.fromJson(array.get(0), String.class);
		int number = gson.fromJson(array.get(1), int.class);
		LinkFormat lf = gson.fromJson(array.get(2), LinkFormat.class);

		System.out.println( title );
		System.out.println( number );
		System.out.println( lf.link );
		System.out.println( lf.name );

		// JSON オブジェクト内にオブジェクト配列
		System.out.println("-----------------------------------------");
		
		json = "";
		json += "{";
		json += "\"title\" : \"サイトデータ\",";
		json += "\"number\" : 2,";
		json += "\"urlList\" : [";
		json += 	"{";
		json += 		"\"link\":\"http://www.yahoo.co.jp/\",";
		json += 		"\"name\":\"Yahoo! JAPAN\"";
		json += 	"},";
		json += 	"{";
		json += 		"\"link\":\"https://www.google.co.jp/\",";
		json += 		"\"name\":\"Google\"";
		json += 	"}";
		json += "]";
		json += "}";
		System.out.println(json);
		
		// 配列バージョン
		SiteData sd = gson.fromJson(json, SiteData.class);
		System.out.println( sd.title );
		System.out.println( sd.number );
		System.out.println( sd.urlList[0].link );
		System.out.println( sd.urlList[0].name );
		System.out.println( sd.urlList[1].link );
		System.out.println( sd.urlList[1].name );

		// ArrayList バージョン
		SiteDataList sdl = gson.fromJson(json, SiteDataList.class);
		System.out.println( sdl.title );
		System.out.println( sdl.number );
		System.out.println( sdl.urlList.get(0).link );
		System.out.println( sdl.urlList.get(0).name );
		System.out.println( sdl.urlList.get(1).link );
		System.out.println( sdl.urlList.get(1).name );

	}

}


※ 整形したい場合は以下のようにします
// オブジェクトを整形して JSON 文字列に変換する
Gson gsonPretty = new GsonBuilder().setPrettyPrinting().create();
String jsonString = gsonPretty.toJson(sd);


タグ:java JSON
【Javaの最新記事】
posted by lightbox at 2017-05-25 21:41 | Java | このブログの読者になる | 更新情報をチェックする

2017年05月20日


デスクトップのアイコン表示を切り替えるバッチファイル

デスクトップを右クリックして表示されるポップアップメニューの、『表示』サブメニューから、『デスクトップアイコンの表示』で切り替える事ができる機能をコマンドプロンプトから可能にします

di.bat
@echo off
cmd "/c echo set o=CreateObject("Shell.Application"):Set osw=o.Windows:Set oie=osw.Item:oie.Document.FolderFlags=CLng(oie.Document.FolderFlags) Xor ^&H00001000 > %TEMP%\_.vbs & wscript.exe %TEMP%\_.vbs"

echo コマンドで、vbscript のコードをテンポラリフォルダに作成して実行するという手法を用いています。

関連する記事

PATH 環境変数の内容をパス毎に改行して表示する pathx.bat ファイルの内容
管理者権限のコマンドプロンプトを開くバッチファイル
バッチファイル : クリップボードからデータを読み込んで表示

VBScript のコード
Set Shell = CreateObject( "Shell.Application" )

Set objShellWindows = Shell.Windows

Set objIE = objShellWindows.Item

objIE.Document.FolderFlags = CLng(objIE.Document.FolderFlags) Xor &H00001000

1) Shell.Application
2) ShellWindows
3) ShellWindows.Item
4) InternetExplorer
5) FOLDERFLAGS enumeration

※ 結局のところ、IE の Document と FolderFlags の関係を記したドキュメントは見つける事ができていません。

Windows 10 でも動作します。また、VBScript のコードをどこかに保存して(di.bat のままだと、コマンドウイドウが一瞬表示されてしまうので)、Wscript で実行するショートカットを作成して、『新規ツールバー』を作成して登録すれば、Quick Launch として使用可能です。







posted by lightbox at 2017-05-20 14:29 | Comment(0) | コマンド : バッチファイル | このブログの読者になる | 更新情報をチェックする

2017年05月19日


Windows 環境の MySQL から日本語名のテーブルを コマンドプロンプトでエクスポート(mysqldump.exe)する

Windows であっても、MySQL Community Edition(GPL) に対する操作はコマンドプロンプトから行います。Windows では、日本語は SHIFT_JIS( MySQL では cp932 を使用します )で表現されるので、一般的にサーバ側で UTF-8 で構築される MySQL では日本語のテーブル名を mysqldump.exe で認識してくれません。
(mysql.exe では cp932 で最初から調整されています)

show variables like 'cha%'


そこで、mysqldump で以下のようなコマンドラインを作成してデータのエクスポートを行います
mysqldump.exe --host=localhost --user=root --password=パスワード --add-drop-table --force --quote-names --default-character-set=cp932 lightbox 商品マスタ 得意先マスタ > export.sql
▼ 上記コマンドラインに改行を入れて解りやすく並べています
mysqldump.exe
 --host=localhost
 --user=root
 --password=パスワード
 --add-drop-table
 --force
 --quote-names
 --default-character-set=cp932
 lightbox 商品マスタ 得意先マスタ > export.sql
lightbox は、DB名で、商品マスタと得意先マスタはテーブル名です この結果取得される export.sql は以下のようになります
-- MySQL dump 10.13  Distrib 5.7.17, for Win64 (x86_64)
--
-- Host: localhost    Database: lightbox
-- ------------------------------------------------------
-- Server version	5.7.17-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES cp932 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `商品マスタ`
--

DROP TABLE IF EXISTS `商品マスタ`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `蝠・刀繝槭せ繧ソ` (
  `蝠・刀繧ウ繝シ繝荏 varchar(4) NOT NULL,
  `蝠・刀蜷港 varchar(50) DEFAULT NULL,
  `蝨ィ蠎ォ隧穂セ。蜊倅セ。` int(11) DEFAULT NULL,
  `雋ゥ螢イ蜊倅セ。` int(11) DEFAULT NULL,
  `蝠・刀蛻・。杼 varchar(3) DEFAULT NULL,
  `蝠・刀蛹コ蛻・ varchar(1) DEFAULT NULL,
  `菴懈・譌・` datetime DEFAULT NULL,
  `譖エ譁ー譌・` datetime DEFAULT NULL,
  `蛯呵?チ mediumtext,
  `蜑企勁繝輔Λ繧ー` varchar(1) DEFAULT NULL,
  PRIMARY KEY (`蝠・刀繧ウ繝シ繝荏)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `商品マスタ`
--

LOCK TABLES `商品マスタ` WRITE;
/*!40000 ALTER TABLE `商品マスタ` DISABLE KEYS */;
省略(cp932 の insert)
/*!40000 ALTER TABLE `商品マスタ` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `得意先マスタ`
--

DROP TABLE IF EXISTS `得意先マスタ`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `蠕玲э蜈医・繧ケ繧ソ` (
  `蠕玲э蜈医さ繝シ繝荏 varchar(4) NOT NULL,
  `蠕玲э蜈亥錐` varchar(50) DEFAULT NULL,
  `蠕玲э蜈亥玄蛻・ varchar(1) DEFAULT NULL,
  `諡・ス楢?・ varchar(4) DEFAULT NULL,
  `驛オ萓ソ逡ェ蜿キ` varchar(7) DEFAULT NULL,
  `菴乗園・疏 varchar(100) DEFAULT NULL,
  `菴乗園・蛋 varchar(100) DEFAULT NULL,
  `菴懈・譌・` datetime DEFAULT NULL,
  `譖エ譁ー譌・` datetime DEFAULT NULL,
  `邱&#63728;譌・` int(11) DEFAULT NULL,
  `邱&#63728;譌・蛹コ蛻・ int(11) DEFAULT NULL,
  `謾ッ謇墓律` int(11) DEFAULT NULL,
  `蛯呵?チ varchar(100) DEFAULT NULL,
  PRIMARY KEY (`蠕玲э蜈医さ繝シ繝荏)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `得意先マスタ`
--

LOCK TABLES `得意先マスタ` WRITE;
/*!40000 ALTER TABLE `得意先マスタ` DISABLE KEYS */;
省略(cp932 の insert)
/*!40000 ALTER TABLE `得意先マスタ` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2017-05-19 17:34:14

このテキストファイルは、SHIFT_JIS として表示した場合、CREATE TABLE の部分が化けたように見えますが、その直前で /*!40101 SET character_set_client = utf8 */; として utf8 として判断されるようになっているので、MySQL サーバであれば Windows でもレンタルサーバでも正しく動作します(インポート時はレンタルサーバの phpmyadmin で SHIFT_JIS として読み込む)

コマンドプロンプト環境の作成

仮に、c:\user\dos というフォルダにパスを通したとして、この中に以下のバッチファイルを保存します

1) MySQL のコマンドプロンプトからの処理用バッチファイル
(MySQL のコマンドが保存されているパスは PC によって変わります)

2) 管理者権限のコマンドプロンプトを開くバッチファイル

そして、普段 MySQL のサービスは停止しているとして、コマンドプロンプトからサービスを開始する為、ファイル名を指定して実行から、admin と入力して管理者権限でコマンドプロンプトを開きます。

1) sc start MySQL57


2) sc query MySQL57

※ MySQL57 は、システムに登録されたサービス名

表示結果より、『STATE : 4  RUNNING』である事を確認したら、mysql_cmd と入力します(サービスが起動済みならば、ファイル名を指定して実行より、mysql_cmd と入力)。

そして、mysqldump を使用してバックアップを行います。

補足

MySQL で使用可能なキャラクタセット文字列は、SHOW CHARACTER SET で取得できます




posted by lightbox at 2017-05-19 18:05 | Comment(0) | MySQL | このブログの読者になる | 更新情報をチェックする

Windows で Laravel を試す際、PHP の Windows バージョンが 5.6.30 なので、Laravel 5.2 をインストールします

おそらくは、5.4 でも動作するのでは無いかと思いますが、世の中の情報がそれほど最新に対応してるわけでも無く、最新だと、ルーティングするファイルも違うので Laravel 5.2 でテストを行いました。

Laravel 5.2 公式ページ(英文)
バージョン対象PHP バージョンBladeテンプレートルーティングリリース
5.4PHP >= 5.6.4OKroutes/web.php2017/1/24
5.3PHP >= 5.6.4OKroutes/web.php2016/8/23
5.2PHP >= 5.5.9OKapp/Http/routes.php2015/12/21
5.1PHP >= 5.5.9OKapp/Http/routes.php2015/6/9
5.07 > PHP >= 5.4なしapp/Http/routes.php2015/2/4
Laravel 5.2 日本語ドキュメントページ

composer global ... による Laravel のインストール

試してみましたが、これは最新の Larvel がインストールされるため、laravel new ... でプロジェクトを作成する方法はできません。以下のように Composer で行う必要があります。
composer create-project --prefer-dist laravel/laravel プロジェクト名 "5.2.*"
※ プロジェクト名は英数字 上記コマンドは長いので、以下のようなバッチファイルにして php がインストールされているフォルダに保存するといいでしょう ( Composer のインストールで、php インストールフォルダにパスが通っているはずなので )
@echo off
composer create-project --prefer-dist laravel/laravel %1 "5.2.*"

※ laravelx.bat だとすると、laravelx プロジェクト名 で実行できます

それ以降は、一般的な情報通りに、プロジェクトディレクトリでコマンドプロンプトを開いて、以下のコマンドを実行します。
php artisan serve
※ Larvel のインストールされたバージョンの確認は、php artisan -V で確認 ※ Composer のインストールで、PHP のディレクトリが検索パスに追加されています Larvel 5.2 のドキュメントでは、php artisan serve の記述がなくなっていますが、5.3 では復活しています。5.3 では、Homestead も使えますよと一行だけ書かれていますが、Homestead が主流にはなりえなかったのでしょう。 関連する記事 Laravel を試す為に Windows に Composer をインストール
タグ:PHP Laravel
posted by lightbox at 2017-05-19 09:34 | Comment(0) | PHP + WEBアプリ | このブログの読者になる | 更新情報をチェックする

2017年05月14日


Android Studio : OkHttp v3.8.0 で WEBアプリに POST 送信を行う

関連する記事

OkHttp v3.8.0 jar( と okio 1.13.0.jar ) を Eclipse のプロジェクトに追加して一般的な POST 送信を行う

Eclipse の一般的な Java からの送信を AsynTask を使用して Android Studio から送信しました。送信する文字列は、ArrayList にセットして、AsyncTask<ArrayList<String>,Void,String> として定義して引き渡しています。
package com.example.lightbox.posttest;

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.util.ArrayList;

import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) MainActivity.this.findViewById(R.id.button);
        button.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {

        if ( v.getId() == R.id.button) {
            Log.i("lightbox", "クリックされました");
            CallPost();

        }

    }

    private void CallPost() {

        ArrayList<String> data = new ArrayList<String>();
        data.add("winofsql@gmail.com");
        data.add("OkHttp で送信テスト(Android Studio)");
        data.add("日本語\r\n表示");

        AsyncTask<ArrayList<String>,Void,String> async;
        // 非同期実行用オブジェクト
        async = new AsyncTask<ArrayList<String>, Void, String>() {
            @Override
            protected String doInBackground(ArrayList<String>... params) {

                ArrayList<String> data = params[0];

                // HTTP 処理用オプジェクト
                OkHttpClient client = new OkHttpClient();

                // POST 用 FormBody の内容の作成
                FormBody.Builder formbodyBuilder = new FormBody.Builder();
                formbodyBuilder.add("to", data.get(0));
                formbodyBuilder.add("subject", data.get(1));
                formbodyBuilder.add("body", data.get(2));

                // 送信用ユニットの作成
                FormBody formbody = formbodyBuilder.build();

                // 送信用のデータを作成
                Request.Builder requestBuilder = new Request.Builder();
                String url = "https://ドメイン/lightbox/mail/send.php";
                requestBuilder.url(url);
                requestBuilder.post(formbody);
                Request request = requestBuilder.build();

                // 受信用のオブジェクトの準備
                Call call = client.newCall(request);
                String result = "";

                // 送信と受信
                try {

                    Response response = call.execute();
                    result = response.body().string();

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

                return result;
            }

            @Override
            protected void onPostExecute(String s) {
                Log.i("lightbox", s);
                // 画面に対してのアクセスはここから行います


            }
        };

        // 実行
        async.execute(data);

    }

}


Module の build.gradle
apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.lightbox.posttest"
        minSdkVersion 23
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:23.4.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile 'com.squareup.okhttp3:okhttp:3.8.0'
}

※ AndroidManifest.xml には、<uses-permission android:name="android.permission.INTERNET" /> を追加。


posted by lightbox at 2017-05-14 20:07 | Comment(0) | Android Studio 2017 | このブログの読者になる | 更新情報をチェックする
container 終わり

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

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
PHP正規表現チェッカー
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり