web-dev-qa-db-fra.com

Comment retourner un objet JSON à partir de PHP lire depuis une application Android

J'ai la table MySQL suivante.

enter image description here

Je dois envoyer le nom du revendeur à partir de l'application Android et envoyer toutes les lignes correspondantes à l'application. Je ne sais pas comment définir la sortie php.Je sais que je devrais encoder à l'aide de json_encode(array('stuff')); 

Mais je ne sais pas comment formater les données.Been vérifier http://www.w3schools.com/json/ Il montre un exemple 

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

Dois-je utiliser le même format? Comment lire à partir d'Android? Je me réfère http://www.codeproject.com/Articles/267023/Send-and-receive-json-between-Android-and-php

MODIFIER:

    <?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 );
    ?>

Code 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;
    }
} 

Activité principale 

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;
        }

    }


}

Manifeste

<?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>

Réponse JSON dans PHP

{"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}
4
techno

Puisque vous postez ne mentionnez pas un fichier PHP fonctionnel, je l'inclurai par souci d'exhaustivité. Cela pourrait être un long ( long ) post ....

Alors, d'abord. Voici un exemple de fichier PHP enregistré sous le nom my_test.php in à cet emplacement: c:\wamp\www\some_folder_name\my_test.php ( Veuillez consulter l'historique des modifications du code ).

Maintenant, laissez-moi vous expliquer les parties importantes de ce PHP. Ces paramètres doivent être configurés pour utiliser vos paramètres:

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

L'adresse IP doit être soit l'hôte local ou l'adresse IP de l'ordinateur hébergeant la base de données MySQL. De préférence, une adresse IP pour pouvoir tester sur des périphériques physiques. utiliser localhost ne fonctionnerait que sur des périphériques virtuels.

La prochaine étape consiste à ajouter les colonnes à un tableau qui construira un seul enregistrement ( row ) dans la réponse JSON. Jetez un oeil à cette ligne par exemple:

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

Le $stuff["id"] deviendra fondamentalement le tag dans l'objet JSON résultant, tandis que le $row['id'] indiquera le nom de la colonne de la table de votre base de données. Donc, le $row["...."] doit être identique aux noms de colonnes de la table de base de données. Alors que le $stuff["...."] peut être à peu près n'importe quoi. Tant que cela a du sens pour vous.

Cette ligne echo(json_encode($response)); sera convertira la réponse au format JSON.

Regardons maintenant le code Java. Tout d’abord, c’est un cours qui vous aidera à analyser le résultat. Il a été retiré d’un tutoriel d’un site Web ( je ne me souviens plus lequel ). Il suffit de copier et coller le code suivant dans une classe Java. Pas besoin de changer quoi que ce soit dans ce fichier. Lisez-le bien pour comprendre comment cela fonctionne. Je l’ai nommé JSONParser ( Voir l’historique des modifications pour le code ):

Enfin, comment obtenir réellement le JSON résultant et l’analyser dans un Activity/Fragment.

J'analyse les données dans une AsyncTask, ce qui est nécessaire dans tous les cas, compte tenu du fait que vous allez effectuer une opération sur le réseau. ( S'il vous plaît voir l'historique d'édition pour le code )

Points à noter dans cette Java:

  1. Ce String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; doit avoir une adresse IP telle que 192.168.0.x ou si vous testez sur un périphérique virtuel, il devrait s'agir de 10.0.2.2 . Plus tôt ( 192 .. ) ne fonctionnera pas sur un émulateur et plus tard ( 10.0 ... ) ne fonctionnera pas sur un périphérique physique.
  2. Dans ceci: String TAG_STUFF = "stuff";, le "stuff" correspond à cela depuis le fichier PHP: $response["stuff"] = array();. Le TAG_STUFF devrait fondamentalement utiliser ce qui est dans $response["stuff"].

J'espère que tout ce qui précède a du sens. Commentez si vous avez besoin d'aide. ;-)

MISE À JOUR AVEC UNE SOLUTION DE TRAVAIL:

C'est vraiment très bizarre. Mais j'ai une solution de travail. Lors de l'utilisation du code de l'OP, l'application se bloque en effet. Par manque de temps pour tester la cause de ce blocage, je publie directement une solution.

Tout d'abord, au lieu de conserver testing en tant que classe indépendante, créez-la en tant que classe interne dans la MainActivity.

class testing extends AsyncTask<Void, Void, Void>   {
....
}

Deuxièmement, déclarez les variables globalement ( la jParser, URL_TO_PHP, etc ), par rapport aux déclarations en cours précédant la onPreExecute(). Voir la solution complète ci-dessous pour plus de clarté ...

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);
        }
    }
}

Pendant les tests, j'ai également pris un aperçu des résultats. C'est ici:enter image description here

Encore une fois, parce que je suis un peu maigre en ce moment, je ne pourrai pas savoir ce qui cause réellement le blocage dans le code de l'OP. Mais c'est assez intriguant pour le savoir ..

7
Siddharth Lele

Voici un exemple d'utilisation de Volley.jar (lib) pour analyser votre 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);

}

à partir de: link

3
Max Vitruk

Vous devez utiliser la classe JSONParser.Il vous aidera à obtenir la valeur json de webBrowser.Après cela, vous pouvez utiliser comme suit:

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");
}

J'espère que cela vous aidera :)

0
user3515851