質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

359閲覧

Androidとphpのやりとり

HW_

総合スコア18

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/11/30 01:10

編集2017/12/01 04:17

###前提・実現したいこと
AndroidStudioでサーバーのデータベースと接続してデータを保存するアプリを作っています。
android側のデータをphpを介してサーバーのデータベースに保存します。
一度に多数のデータを送信したいです。

###発生している問題・エラーメッセージ
配列に格納されているデータを全て送りたいのですが、for文で回してjsonデータに格納していくと、最後のものしか保存されません。
どのようにすれば一度に配列のデータ全てを送信できますでしょうか。

###該当のソースコード

java

1public class PhpSend extends AsyncTask<String, String, String> { 2 private MainActivity activity; 3 4 public PhpSend(MainActivity activity) { 5 super(); 6 this.activity = activity; 7 } 8 9 @Override 10 protected String doInBackground(String... values) { 11 final StringBuilder result = new StringBuilder(); 12 Globals globals =(Globals)syukkaActivity.getApplication(); 13 URL url = null; 14 String urlSt = "http://10.0.2.2/phpbook/QRsystemSendTest.php"; 15 String readSt = null, str = null; 16 HttpURLConnection con = null; 17 OutputStream os = null; 18 try { 19 url = new URL(urlSt); 20 con = (HttpURLConnection) url.openConnection(); 21 con.setReadTimeout(10000); 22 con.setConnectTimeout(15000); 23 con.setRequestMethod("POST"); 24 con.setRequestProperty("Accept-Language", "ja"); 25 con.setDoInput(true); 26 con.setDoOutput(true); 27 con.setUseCaches(false); 28 con.connect(); 29 30 JSONObject jsonObject = new JSONObject(); 31 for (int i = 0; i < globals.ArrayNum; i++) { 32 jsonObject.put("bango_1", globals.bango_1[i]); 33 jsonObject.put("bango_2", globals.bango_2[i]); 34 jsonObject.put("h_code", globals.h_code[i]); 35 jsonObject.put("h_name", globals.h_name[i]); 36 jsonObject.put("nyusu", globals.nyusu[i]); 37 jsonObject.put("syomi_date", globals.syomi_date[i]); 38 } 39 os = con.getOutputStream(); 40 BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 41 bufferedWriter.write(String.valueOf(jsonObject)); 42 bufferedWriter.flush(); 43 bufferedWriter.close(); 44 45 os.close(); 46 int status = con.getResponseCode(); 47 48 switch (status) { 49 case HttpURLConnection.HTTP_OK: 50 InputStream is = con.getInputStream(); 51 BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 52 String httpSource = new String(); 53 String string; 54 while (null != (string = reader.readLine())) { 55 httpSource = httpSource + string; 56 } 57 is.close(); 58 break; 59 case HttpURLConnection.HTTP_UNAUTHORIZED: 60 break; 61 default: 62 break; 63 } 64 } catch (MalformedURLException e1) { 65 e1.printStackTrace(); 66 } catch (ProtocolException e1) { 67 e1.printStackTrace(); 68 } catch (IOException e1) { 69 e1.printStackTrace(); 70 } catch (Exception e) { 71 e.printStackTrace(); 72 } finally { 73 if (con != null) { 74 con.disconnect(); 75 } 76 } 77 return readSt; 78 } 79 80 @Override 81 protected void onProgressUpdate(String... values) { 82 // 83 84 } 85 86 @Override 87 protected void onPostExecute(String result) { 88 } 89}

php

1<?php 2$dsn = 'mysql:host=localhost;dbname=qrsystemtest;charset=utf8mb4'; 3$username = 'root'; 4$password = ''; 5 6try{ 7 $pdo = new PDO($dsn,$username,$password); 8 $input_str = file_get_contents("php://input"); 9 $input_json = json_decode($input_str,true); 10 $bango_1 = $input_json["bango_1"]; 11 $bango_2 = $input_json["bango_2"]; 12 $h_code = $input_json["h_code"]; 13 $h_name = $input_json["h_name"]; 14 $nyusu = $input_json["nyusu"]; 15 $syomi_date = $input_json["syomi_date"]; 16 17 // データを取得 18 $stmt = $pdo->prepare("INSERT INTO t_kari_send_his (bango_1, bango_2, h_code, h_name, nyusu, syomi_date) 19 VALUES(:bango_1, :bango_2, :h_code, :h_name, :nyusu, :syomi_date)"); 20 $stmt -> bindParam(':bango_1', $bango_1, PDO::PARAM_STR); 21 $stmt -> bindParam(':bango_2', $bango_2, PDO::PARAM_STR); 22 $stmt -> bindParam(':h_code', $h_code, PDO::PARAM_STR); 23 $stmt -> bindParam(':h_name', $h_name, PDO::PARAM_STR); 24 $stmt -> bindParam(':nyusu', $nyusu, PDO::PARAM_STR); 25 $stmt -> bindParam(':syomi_date', $syomi_date, PDO::PARAM_STR); 26 $stmt -> execute(); 27 28 29}catch (PDOException $e) { 30 echo mb_convert_encoding($e->getMessage(),'UTF-8','SJIS-win'); 31} 32$pdo = null; 33?>

###追記
java側のソース(for文周辺のみ)を修正したものを追記します。

java

1JSONObject jsonObject = new JSONObject(); 2 JSONObject jsonObjectSum = new JSONObject(); 3 JSONObject[globals.ArrayNum]; 4 String name; 5 for (int i = 0; i < globals.ArrayNum; i++) { 6 name = "QR_SOSIN_HIS" + i; 7 jsonObject.put("_id", globals.id[i]); 8 jsonObject.put("bango_1", globals.bango_1[i]); 9 jsonObject.put("bango_2", globals.bango_2[i]); 10 jsonObject.put("h_code", globals.h_code[i]); 11 jsonObject.put("h_name", globals.h_name[i]); 12 jsonObject.put("nyusu", globals.nyusu[i]); 13 jsonObject.put("syomi_date", globals.syomi_date[i]); 14 jsonObjectSum.put(name, jsonObject); 15 Log.d("jsontest", "jsonObjectSumの中身は" + jsonObjectSum); 16 } 17

新たにjsoObjectSumを追加し、そこに動的に作った名前のキーにどんどん追加していくようにしたのですが、キーの名前を動的に変えているのに内容が全て後のものに上書きされてしまいます。(JSONArrayを使ってputしていっても同様)
上書きされずに一個一個保存していきたいのですがどうすれば良いでしょうか?
Logの詳細(jsonObjectSumの中身)は以下の通りです。

D/jsontest: jsonObjectSumの中身は{"QR_SOSIN_HIS0":{"_id":1,"bango_1":"a","bango_2":"a","h_code":"a","h_name":"a","nyusu":"a","syomi_date":"a"}} D/jsontest: jsonObjectSumの中身は{"QR_SOSIN_HIS0":{"_id":2,"bango_1":"ab","bango_2":"ab","h_code":"ab","h_name":"ab","nyusu":"ab","syomi_date":"ab"},"QR_SOSIN_HIS1":{"_id":2,"bango_1":"ab","bango_2":"ab","h_code":"ab","h_name":"ab","nyusu":"ab","syomi_date":"ab"}}

実現したいのは下記のようにidが1のものが一つ目に格納され、二つ目にidが2のものが追加されてほしい

D/jsontest: jsonObjectSumの中身は{"QR_SOSIN_HIS0":{"_id":1,"bango_1":"a","bango_2":"a","h_code":"a","h_name":"a","nyusu":"a","syomi_date":"a"}} D/jsontest: jsonObjectSumの中身は{"QR_SOSIN_HIS0":{"_id":1,"bango_1":"a","bango_2":"a","h_code":"a","h_name":"a","nyusu":"a","syomi_date":"a"},"QR_SOSIN_HIS1":{"_id":2,"bango_1":"ab","bango_2":"ab","h_code":"ab","h_name":"ab","nyusu":"ab","syomi_date":"ab"}}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aja

2017/11/30 02:13

onProgressUpdate で途中経過的にやるとどうなるのでしょう?また、private Activity activity;は警告がでませんか?
退会済みユーザー

退会済みユーザー

2017/11/30 02:41

どういうjson構造にしたいのか、例示してもらえますか? putで置く今の形だと、勝手に配列にはなりませんよね。
guest

回答3

0

Android開発の専門家じゃないですけど、
この記事、参考になるんじゃないでしょうか。
[Processing] JSONの読み込み書き込み

一定のデータ構造の繰り返しをまとめるときは
JSONArrayを使うようで、
JSONArrayインスタンスでappendメソッドで追加することで配列化されるようです。
一つのレコードをJSONObject化したら送信用JSONArrayにappendすればいいのかなと。

投稿2017/11/30 02:44

編集2017/11/30 03:02
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HW_

2017/11/30 04:16

回答ありがとうございます! 読ませていただいて、なるほど!と思ったのですが、appendメソッドを実装しようとしたら Cannot resolve method 'append(org.json.JSONObject)’ と出て、使えません… ソースはJSONArrayをインスタンス化した後、for文の最後に jsonArray.append(jsonObject) と付け足しました。
退会済みユーザー

退会済みユーザー

2017/11/30 11:35

JSONObjectにはappendメソッドはないです。あくまでJSONArray.appendです。 JSONArrayとJSONObjectは変換も可能なようですよ。 修正したjava側ソースを、質問文に追記してみてはいかがでしょうか。 (元のソースを消したり直したりすると、質問と回答のやり取りが第三者にわかりにくくなるので。)
HW_

2017/12/01 02:34 編集

JSONArray.appendでエラーが出ます。 質問文に追記いたしました。appendが使えなかったので別の方法を取ろうとしたら別の問題が出てしまいました…
yona

2017/12/01 03:49

お二方はProcessingとは何かわかっていますか?
yona

2017/12/01 03:50 編集

お二方はProcessingとは何かわかっていますか? 失礼、二重で投稿されました。
guest

0

自己解決

・JSONObject jsonObject = new JSONObject();をfor文内で行うことで追記部分を解決
・php側も配列に対応できるよう変更

修正したソースを以下に

java

1JSONObject jsonObjectSum = new JSONObject(); 2 String name; 3 for (int i = 0; i < globals.ArrayNum; i++) { 4 JSONObject jsonObject = new JSONObject(); //インスタンス化をfor文内で 5 name = "QR_SOSIN_HIS" + i; //動的にキーを取得 6 jsonObject.put("bango_1", globals.bango_1[i]); 7 jsonObject.put("bango_2", globals.bango_2[i]); 8 jsonObject.put("h_code", globals.h_code[i]); 9 jsonObject.put("h_name", globals.h_name[i]); 10 jsonObject.put("nyusu", globals.nyusu[i]); 11 jsonObject.put("syomi_date", globals.syomi_date[i]); 12 jsonObjectSum.put(name, jsonObject); //まとめてputする 13 } 14 15 os = con.getOutputStream(); 16 BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 17 bufferedWriter.write(String.valueOf(jsonObjectSum)); 18 bufferedWriter.flush(); 19 bufferedWriter.close();

php

1try{ 2 // データベースへの接続を表すPDOインスタンスを生成 3 $pdo = new PDO($dsn,$username,$password); 4 $input_str = file_get_contents("php://input"); 5 $input_json = json_decode($input_str,true); 6 $json_count = count($input_json); 7 8 $bango_1 = array(); 9 $bango_2 = array(); 10 $h_code = array(); 11 $h_name = array(); 12 $nyusu = array(); 13 $syomi_date = array(); 14 15 16 for($i=0;$i<$json_count;$i++){ 17 $str = "QR_SOSIN_HIS$i"; 18 $bango_1[] = $input_json["$str"]["bango_1"]; 19 $bango_2[] = $input_json["$str"]["bango_2"]; 20 $h_code[] = $input_json["$str"]["h_code"]; 21 $h_name[] = $input_json["$str"]["h_name"]; 22 $nyusu[] = $input_json["$str"]["nyusu"]; 23 $syomi_date[] = $input_json["$str"]["syomi_date"]; 24 25 26 $stmt = $pdo->prepare("INSERT INTO t_kari_send_his (bango_1, bango_2, h_code, h_name, nyusu, syomi_date) 27 VALUES(:bango_1, :bango_2, :h_code, :h_name, :nyusu, :syomi_date)"); 28 $stmt -> bindParam(':bango_1', $bango_1[$i], PDO::PARAM_STR); 29 $stmt -> bindParam(':bango_2', $bango_2[$i], PDO::PARAM_STR); 30 $stmt -> bindParam(':h_code', $h_code[$i], PDO::PARAM_STR); 31 $stmt -> bindParam(':h_name', $h_name[$i], PDO::PARAM_STR); 32 $stmt -> bindParam(':nyusu', $nyusu[$i], PDO::PARAM_STR); 33 $stmt -> bindParam(':syomi_date', $syomi_date[$i], PDO::PARAM_STR); 34 $stmt -> execute(); 35 } 36

投稿2017/12/01 05:50

編集2017/12/01 07:19
HW_

総合スコア18

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

JSONにはオブジェクトとアレイがあり、これらを入れ子にする事が出来ます。
AndroidではJSONObjectとJSONArrayがそれぞれオブジェクトとアレイを表現するクラスとして定義されています。
今回はアレイなのでJSONArrayを使うべきですね。
また、AndroidでのJSONの取り扱い方をまとめているので参考にしてください。

投稿2017/11/30 06:23

yona

総合スコア18155

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

HW_

2017/12/01 01:10

回答ありがとうございます。 参考に読ませていただいたのですが、今回のような場合JSONArrayを使ってどのように書いたらよいか具体的に教えていただけませんか?
yona

2017/12/01 03:45

提示したページ以降の数ページも合わせて参考にしてください。 また、どのようなJSONを受け入れるかによって組み立て方が変わるので、一通り読んだ方がいいですよ。
HW_

2017/12/01 04:18

読ませていただいたのですが追記のようになる原因、解決法がわかりません… どのように書けば解決できますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問