【Java】【Android】【PHP】【JSON】JSON を PHP から送信して、Java で受信する 
2014/07/31 Thu [edit]
前回、Google の Gson(Json) による JSON 形式デコードが上手くいったので、今回は PHP から Java での受信を試みる。
というわけで PHP の方にも JSON 変換のライブラリが必要なので、以下からダウンロード。
・http://mike.teczno.com/JSON.tar.gz
・PHPからJSON作成を扱う
(*)どちらも同じ。
アーカイブを解凍したら、ドキュメントやサンプルなどを含めて色々出てくると思うが、とりあえず変換ライブラリ「JSON.php」をサーバーに配置する。
サンプルコードは超絶簡単なものにする。エラーなどは考えてないので、必要なら適当に付け加えて欲しい。とりあえずファイル名を「json_out.php」としておく。
■JSON 形式データ送信用 PHP(json_out.php)
<?php
require_once("JSON.php"); //JSON 変換ライブラリ
//テスト用データ
$data = array(
"name" => "John",
"age" => 22,
"male" => true
);
$json = new Services_JSON;
$encode = $json->encode($data); //JSON 形式へエンコード
header('Content-type: text/plain; charset=utf-8');
echo $encode; //テキスト出力
?>
header() で Content-type を出力してるので、「<?php」タグより以前に文字列などを書かないように注意。改行1つでも入ると、PHP では text/html として出力されてしまう。
Content-type の出力としては、
header('Content-Type: text/javascript; charset=utf-8');
header('Content-type: application/json');
なども使えたが、以降の Java コードで、Content-Length が上手く取れなかったので、text/plain にしておいた。クライアントアプリによって、必要に応じて変更しても良いだろう。
次に、ストリームからの読み込みに新たに readLinesText() という関数を作ってみた。エンコードがあらかじめ "UTF-8" と決めてあって、データ受信にしか使用ないような、固定用途なら問題なく使える。その他には、以前「テキストファイルの読み込み」で作った loadText(), readStream() もそのまま使える。この2つの関数を簡易的にまとめたものに近い。小さなデータを頻繁に読み込むなら、readLinesText() の方が少しばかり速い気がする。どちらを使っても構わない。
■ストリームから行読みするライブラリ readLinesText()
//Reader でのテキスト読み込み(※最後に改行が付くので編集用には向かない。エンコードもシステム依存)
public static final String readLinesText(InputStream is) throws IOException {
final StringBuilder str = new StringBuilder();
final String sep = System.getProperty("line.separator"); //改行コード
final BufferedReader br = new BufferedReader(new InputStreamReader(is));
try {
while (br.ready()) {
str.append(br.readLine()); //終端文字は含まない
str.append(sep); //改行コード追加
}
return str.toString();
} finally {
try {
br.close();
} catch (Exception e) {
//IOException
}
str.setLength(0);
}
}
あとは、前回作ったサンプルをそのまま使って、Java で JSON を取得してみる。
■JSON 形式データ受信用 Java
//データ格納用クラス(構造体)[※前回と同じもの]
public class Data {
public String name;
public int age;
public boolean male;
public Data(String name, int age, boolean male) {
this.name = name;
this.age = age;
this.male = male;
}
}
//テストのメイン... (※例外処理は簡略)
final int CONNECT_TIMEOUT = 10 * 1000; //接続タイムアウト[ms]
final int READ_TIMEOUT = 5 * 1000; //読み取りタイムアウト[ms]
final String ENCORDING = "UTF-8"; //loadText() 用
String phpUrl = "http://(テストするサーバー)/json_out.php"; //JSON 送信用 PHPのURL
try {
URL url = new URL(phpUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECT_TIMEOUT); //接続タイムアウト
con.setReadTimeout(READ_TIMEOUT); //読み取りタイムアウト
con.setRequestMethod("GET");
con.connect();
String text3 = readLinesText(con.getInputStream());
// String text3 = loadText(con.getInputStream(), ENCORDING); //※以前作ったライブラリ
con.disconnect();
//確認
System.out.println(text3);
//JSON 解析して、データ用クラスに代入
Gson gson = new Gson();
Data data3 = gson.fromJson(text3, Data.class);
//確認
System.out.println("[Data3]");
System.out.println("name = " + data3.name);
System.out.println("age = " + data3.age);
System.out.println("male = " + data3.male);
} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
結果は以下の通り。
{"name":"John","age":22,"male":true}
[Data3]
name = John
age = 22
male = true
例外処理はかなり手抜きしてるので、必要に応じて適当に。
URL は HttpURLConnection を使ってるので「http://」前提だが、「https://」なら、HttpsURLConnection を使った方が良いかも知れない(テスト環境がないので、やったことない)。またこの程度のサンプルなら、URLConnection でも使える(con.setRequestMethod("GET"); の行を削除。デフォルトで GET なので問題ない)。
PHP は非常に簡単なサンプルだが、内容をデータベースからの読み込みに変更して JSON 出力にすれば、色々応用できるだろう。また本来なら、サーバーのレスポンスも考慮に入れて、ネットからのダウンロード等は別スレッドでやった方が良い。Android なら Service や AsyncTask がよく使われているようだ。
(関連記事)
【Java】【PHP】【JSON】JSON を Java から送信して、PHP で受信する
【Java】【JSON】Google Gson(Json) を Eclipse にインポートして使う
【Java】【Android】【PHP】画像を PHP から送信して、Android で受信する
【MongoDB】【Windows】Windows版 MongoDB をインストールして使う
- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/141-d7265159
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |