Как вернуть объект JSON из PHP для чтения из приложения Android

У меня есть следующая таблица MySQL .

введите описание изображения здесь

Мне нужно отправить имя дилера из приложения android и отправить все подходящие строки в приложение. Я не знаю, как установить php output.I знаю, что я должен кодировать с помощью 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} 

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

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

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

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

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

Это echo(json_encode($response)); линия echo(json_encode($response)); преобразует ответ в формат JSON.

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

Наконец, как бы получить полученный JSON и проанализировать его в Activity / Fragment .

Я разбираю данные в 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 и т. Д. ) В 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); } } } 

Во время тестирования, я также сделал screengrab результатов. Вот: введите описание изображения здесь

Опять же, поскольку в настоящий момент я немного похудел, я не смогу узнать, что действительно вызывает крах в коде OP. Но это достаточно интригует, чтобы узнать.

Это пример того, как использовать 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); 

}

от: link

Вы должны использовать класс 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"); } 

Надеюсь, эта помощь тебе поможет 🙂