it-swarm.com.ru

Как вернуть JSON Объект из PHP читать из приложения 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>

Ответ JSON в 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

Поскольку в вашем посте не упоминается рабочий файл PHP, я буду включать его для полноты картины. Это может быть длинный (long) пост ....

Итак, во-первых. Это пример файла PHP, который хранится с именем my_test.php in в этом месте: 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-адрес должен быть локальным или IP-адресом компьютера, на котором размещена база данных MySQL. Желательно IP-адрес, чтобы вы могли проверить на физических устройствах. использование localhost будет работать только на виртуальных устройствах.

Затем добавляем столбцы в массив, который будет создавать одну запись (row) в ответе JSON. Взгляните на эту строку, например:

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

$stuff["id"] в основном станет tag в результирующем объекте JSON, тогда как $row['id'] - это то, что указывает имя столбца из таблицы вашей БД. Таким образом, $row["...."] должен быть идентичен именам столбцов в таблице БД. Хотя $stuff["...."] может быть что угодно. Пока это имеет смысл для тебя.

Эта строка echo(json_encode($response)); будет преобразовывать ответ в формат JSON.

Теперь давайте посмотрим на код Java. Сначала в этом классе, который поможет вам разобрать результат. Он был снят с учебника на сайте (я не помню, какой). Просто скопируйте и вставьте следующий код в класс Java. Не нужно ничего менять в этом файле. Внимательно прочитайте, чтобы понять, как это работает. У меня есть его с именем JSONParser (Пожалуйста, смотрите историю редактирования для кода):

Наконец, как на самом деле получить полученный JSON и проанализировать его в ActivityFragment.

Я анализирую данные в переменной AsyncTask, которая требуется в любом случае, учитывая, что вы будете выполнять сетевую операцию. (_/Пожалуйста, смотрите историю редактирования для кода)

Точки для заметки в этой Java:

  1. Этот String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; должен иметь либо IP-адрес, например 192.168.0.x, либо, если вы тестируете на виртуальном устройстве, это должен быть 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>   {
....
}

Во-вторых, объявите переменные глобально (jParser, URL_TO_PHP и т.д.), В отличие от текущих объявлений перед функцией onPreExecute(). См. Полное решение ниже для ясности ...

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. Это поможет получить значение json из webBrowser. После этого вы можете использовать так:

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