web-dev-qa-db-ja.com

PHPからJSONオブジェクトを返す方法Androidアプリ

次のMySQLテーブルがあります。

enter image description here

Androidアプリからディーラー名を送信し、一致するすべての行をアプリに送信する必要があります。php出力を設定する方法がわかりません。json_encode(array('stuff'));を使用してエンコードする必要があることを知っています

しかし、私はデータをフォーマットする方法がわかりません。チェックのチェック http://www.w3schools.com/json/ これは例を示しています

{"employees":[
    {"firstName":"John", "lastName":"Doe"}, 
    {"firstName":"Anna", "lastName":"Smith"},
    {"firstName":"Peter", "lastName":"Jones"}
]}

同じ形式を使用する必要がありますか?Androidからこれを読む方法?参照している http://www.codeproject.com/Articles/267023/Send-and-receive-json -between-Android-and-php

編集:

    <?php

  //$con goes here 
    $result=$conn->query("SELECT pname FROM products");
    $response["stuff"] = array();

        while($row = $result->fetch_assoc())    {

            $stuff= array();

            /* ADD THE TABLE COLUMNS TO THE JSON OBJECT CONTENTS */
            $stuff["pname"] = $row['pname'];
            array_Push($response["stuff"], $stuff);

            // $response[] = $row;
        }
        // success
        $response["success"] = 1;
        echo(json_encode($response));


    /* CLOSE THE CONNECTION */
    mysqli_close($conn );
    ?>

Javaコード:

package com.example.testing;

import Java.util.ArrayList;
import Java.util.List;

import org.Apache.http.NameValuePair;
import org.json.JSONArray;
import org.json.JSONObject;

import Android.os.AsyncTask;
import Android.util.Log;

class testing extends AsyncTask<Void, Void, Void>   {
    JSONParser jParser; 
    String URL_TO_PHP = "http://coolsite.com/dashboard/test.php";
    String TAG_SUCCESS = "success";
    String TAG_STUFF = "stuff";

    protected Void doInBackground(Void... args) {

        /* Building Parameters */
        List <NameValuePair> params = new ArrayList<NameValuePair>();

        /* getting JSON string from URL */
        JSONObject json = jParser.makeHttpRequest(URL_TO_PHP, "GET", params);

        try {
            /* Checking for SUCCESS TAG */
            int success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
                JSONArray JAStuff = json.getJSONArray(TAG_STUFF);

                /** CHECK THE NUMBER OF RECORDS **/
                int intStuff = JAStuff.length();

                if (intStuff != 0)  {

                    for (int i = 0; i < JAStuff.length(); i++) {
                        JSONObject JOStuff = JAStuff.getJSONObject(i);
                        Log.e("ALL THE STUFF", JOStuff.toString());

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

        return null;
    }
} 

主な活動

package com.example.testing;
import Android.app.Activity;
import Android.os.Bundle;
import Android.view.Menu;
import Android.view.MenuItem;
import Android.view.View;

public class MainActivity extends Activity {

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

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);

    }
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1:
          new testing().execute();
            break;
        default:
            break;
        }

    }


}

マニフェスト

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.example.testing"
    Android:versionCode="1"
    Android:versionName="1.0" >

    <uses-sdk
        Android:minSdkVersion="19"
        Android:targetSdkVersion="21" />

<uses-permission Android:name="Android.permission.INTERNET" />
    <application
        Android:allowBackup="true"
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name"
        Android:theme="@style/AppTheme" >
        <activity
            Android:name=".MainActivity"
            Android:label="@string/app_name" >
            <intent-filter>
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

PHPでのJSON応答

{"stuff":[{"pname":"Advocates"},{"pname":"Notaries"},{"pname":"Agriculture \/ Fertilizer"},{"pname":"Airconditioners"},{"pname":"Animation"},{"pname":"Airline Companies"},{"pname":"Aluminium Fabricators"},{"pname":"Amusement Parks"},{"pname":"Pets shop"},{"pname":"Association \/ Societies"},{"pname":"Astrology"},{"pname":"Attestation Service"},{"pname":"Auditorium"},{"pname":"Automobiles Accessories"},{"pname":"Automobile Dealers"},{"pname":"Ayurveda"},{"pname":"Gifts Articles"},{"pname":"Bags"},{"pname":"Batteries"},{"pname":"Bearings"},{"pname":"Beauty Parlours \/ Spa"},{"pname":"Magazine Dealers"},{"pname":"Building Contractors"},{"pname":"Building Materials"},{"pname":"Cameras"},{"pname":"Cast Iron Products"},{"pname":"Home Delivery"},{"pname":"Cements Wholesale \/ Retail"},{"pname":"Chemicals"},{"pname":"Contractors"},{"pname":"Consultants"},{"pname":"Parcel Services"},{"pname":"Crockery"},{"pname":"Dental Clinics"},{"pname":"Cyber Parks"},{"pname":"Dance School\/Costumes"},{"pname":"Diagnostics Labs& X-Rays"},{"pname":"Distance Education"},{"pname":"Driving Schools"},{"pname":"Dry Cleaners"},{"pname":"DTH Services"},{"pname":"DTP Centers"},{"pname":"Electrical Contractors \/ Services"},{"pname":"Electronics Equipment \/ Servicing"},{"pname":"Coaching Centre"},{"pname":"Event Management"},{"pname":"Fancy \/ Stationery"},{"pname":"Pooja stores"},{"pname":"Food Products"},{"pname":"Foot Wear"},{"pname":"Foreign Exchange"},{"pname":"Furniture shop"},{"pname":"Granites \/ Marbles"},{"pname":"Hospitals \/ Clinics"},{"pname":"Computer Accessories"},{"pname":"Kitchen Cabinets"},{"pname":"Library"},{"pname":"Lights \/ Fittings"},{"pname":"Mobile Phone Accesseries"},{"pname":"Machinery \/ Tools"},{"pname":"Timber Manufacturer"},{"pname":"Real Estate Agents"},{"pname":"Security Services"},{"pname":"Solar Products"},{"pname":"Health & Fitness"},{"pname":"Travel Agencies"},{"pname":"Used Car \/ Bikes"},{"pname":"Waste Management"},{"pname":"Watches & Clocks"},{"pname":"Handicrafts"},{"pname":"Doors & Windows"}],"success":1}
5
techno

あなたが投稿しているので作業中のPHPファイルについて言及していないので、完全を期すためにそれを含めます。これは長くなる可能性があります(long)役職....

最初に。これは、次の場所に保存されているPHPという名前のファイルmy_test.phpの例です:_c:\wamp\www\some_folder_name\my_test.php_(コードの編集履歴をご覧ください

ここで、このPHPの重要な部分について説明します。これらのパラメーターは、設定を使用するように構成する必要があります。

_$DB_Host = 'YOUR_IP_ADDRESS';
$DB_UNAME = 'MYSQL_USERNAME';
$DB_PWD = 'MYSQL_USER'S_PASSWORD';
$DB_DATABASE = 'DATABASE_NAME';
_

IPアドレスは、ローカルホストか、MySQLデータベースをホストしているコンピューターのIPアドレスのいずれかである必要があります。物理デバイスでテストできるように、できればIPアドレス。 localhostを使用すると、仮想デバイスでのみ機能します。

次に、JSONレスポンスで単一のレコード(row)を構築する配列に列を追加します。たとえば、次の行を見てください。

_$stuff["id"] = $row['id'];
_

_$stuff["id"]_は、基本的に、結果のJSONオブジェクトのtagになりますが、_$row['id']_は、DBのテーブルの列名を示します。したがって、_$row["...."]_は、DBテーブルの列名と同じである必要があります。一方、_$stuff["...."]_は、ほぼ何でもかまいません。それがあなたにとって意味がある限り。

この行echo(json_encode($response));は、応答をJSON形式にconvertします。

Javaコードを見てみましょう。最初に、これは結果を解析するのに役立つクラスです。これはWebサイトからチュートリアルから削除されました(覚えていません。次のコードをコピーして、Javaクラスに貼り付けます。このファイルの内容を変更する必要はありません。よく読んでください。 JSONParserコードの編集履歴を参照してください):

最後に、結果のJSONを実際に取得し、Activity/Fragmentで解析する方法。

私はAsyncTaskのデータを解析します。これは、ネットワーク操作を実行することを考えるととにかく必要です。 (コードの編集履歴をご覧ください

このJavaの注意点:

  1. この_String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php";_には、192.168.0.xなどのIPアドレスが必要です。または、仮想デバイスでテストしている場合は、10.0 .2.2。以前の(192 ..)はエミュレータでは機能せず、後の(10.0 ...)は機能しません物理デバイスで作業します。
  2. これで:_String TAG_STUFF = "stuff";_、_"stuff"_はPHPファイル:$response["stuff"] = array();からこれに対応します。_TAG_STUFF_は基本的にwhats _$response["stuff"]_内。

上記のすべてが理にかなっていると思います。ヘルプが必要な場合はコメントしてください。 ;-)

実用的なソリューションで更新:

これは確かに非常に奇妙です。しかし、私には実用的な解決策があります。 OPのコードを使用すると、実際にアプリケーションがクラッシュします。クラッシュする理由をテストする時間がないため、代わりに直接ソリューションを投稿しています。

まず、testingを独立したクラスとして保持する代わりに、MainActivityで内部クラスとして作成します。

_class testing extends AsyncTask<Void, Void, Void>   {
....
}
_

次に、onPreExecute()の前の現在の宣言に対して、変数をグローバルに宣言します(the jParser、_URL_TO_PHP_、etc))。 。明確にするために、以下の完全なソリューションを参照してください...

_public class MainActivity extends Activity {

    JSONParser jParser;
    String URL_TO_PHP = "http://testbox.site50.net/test.php";
    String TAG_SUCCESS = "success";
    String TAG_STUFF = "stuff";

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

    ....

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                new testing().execute();
                break;
            default:
                break;
        }

    }

    private class testing extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... args) {

            /* Building Parameters */
            List<NameValuePair> params = new ArrayList<>();

            /* getting JSON string from URL */
            JSONObject json = jParser.makeHttpRequest(URL_TO_PHP, "GET", params);

            try {
                /* Checking for SUCCESS TAG */
                int success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                    JSONArray JAStuff = json.getJSONArray(TAG_STUFF);

                    /** CHECK THE NUMBER OF RECORDS **/
                    int intStuff = JAStuff.length();

                    if (intStuff != 0) {

                        for (int i = 0; i < JAStuff.length(); i++) {
                            JSONObject JOStuff = JAStuff.getJSONObject(i);
                            Log.e("ALL THE STUFF", JOStuff.toString());
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
        }
    }
}
_

テスト中、結果のスクリーングラブも撮りました。ここにあります: enter image description here

繰り返しますが、私は現在少し痩せているので、OPのコードで実際にクラッシュを引き起こしている原因を見つけることはできません。しかし、それは知るのに十分興味をそそります。

7
Siddharth Lele

これは、Volley.jar(lib)を使用してJSONを解析する方法の例です。

private void makeJsonArrayRequest() {

showpDialog();

JsonArrayRequest req = new JsonArrayRequest(urlJsonArry,
        new Response.Listener<JSONArray>() {
            @Override
            public void onResponse(JSONArray response) {
                Log.d(TAG, response.toString());

                try {
                    // Parsing json array response
                    // loop through each json object
                    jsonResponse = "";
                    for (int i = 0; i < response.length(); i++) {

                        JSONObject person = (JSONObject) response
                                .get(i);

                        String name = person.getString("name");
                        String email = person.getString("email");
                        JSONObject phone = person
                                .getJSONObject("phone");
                        String home = phone.getString("home");
                        String mobile = phone.getString("mobile");

                        jsonResponse += "Name: " + name + "\n\n";
                        jsonResponse += "Email: " + email + "\n\n";
                        jsonResponse += "Home: " + home + "\n\n";
                        jsonResponse += "Mobile: " + mobile + "\n\n\n";

                    }

                    txtResponse.setText(jsonResponse);

                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(),
                            "Error: " + e.getMessage(),
                            Toast.LENGTH_LONG).show();
                }

                hidepDialog();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                VolleyLog.d(TAG, "Error: " + error.getMessage());
                Toast.makeText(getApplicationContext(),
                        error.getMessage(), Toast.LENGTH_SHORT).show();
                hidepDialog();
            }
        });

// Adding request to request queue
AppController.getInstance().addToRequestQueue(req);

}

から: リンク

3
Max Vitruk

JSONParserクラスを使用する必要があります.webBrowserからjson値を取得するのに役立ちます。この後、次のように使用できます:

JSONObjcet object=getJSONObject("result");
JSONArray arr=object.getJSONArray("employees");
for(int i=0;i<arr.length;i++){
JSONObject obj1=arr.getJSONObject(i);
String firstName=obj1.getString("firstName");
String lastName=obj1.getString("lastName");
}

これがあなたのお役に立てば幸いです:)

0
user3515851