[英]How to return JSON Object from PHP to read from Android App
我有以下MySQL
表。
我需要從android
應用程序發送經銷商名稱並將所有匹配的行發送到app.I不知道如何設置php
輸出。我知道我應該使用json_encode(array('stuff'));
進行編碼json_encode(array('stuff'));
但我不知道如何格式化數據.Been檢查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}
由於你的帖子沒有提到一個有效的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或托管MySQL數據庫的計算機的IP地址。 最好是IP地址,以便在物理設備上進行測試。 使用localhost僅適用於虛擬設備。
接下來是將列添加到將在JSON響應中構造單個記錄( 行 )的數組中。 看一下這一行,例如:
$stuff["id"] = $row['id'];
$stuff["id"]
基本上將成為生成的JSON對象中的標記 ,而$row['id']
表示數據庫表中的列名。 所以$row["...."]
必須與DB表中的列名相同。 雖然$stuff["...."]
可以是任何東西。 只要它對你有意義。
這行echo(json_encode($response));
將轉換響應成JSON格式。
現在讓我們看一下Java代碼。 首先,這是一個可以幫助您解析結果的類。 它取消了一個網站的教程( 我不記得哪個 )。 只需將以下代碼粘貼到Java類中即可。 無需更改此文件中的任何內容。 請仔細閱讀以了解其工作原理。 我把它命名為JSONParser ( 請參閱代碼的編輯歷史記錄 ):
最后,如何實際獲取生成的JSON並將其解析為Activity
/ Fragment
。
我在AsyncTask
解析數據,無論如何,考慮到您將執行網絡操作,這是必需的。 ( 請參閱代碼的編輯歷史記錄 )
Java中的注意事項:
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 ... )將無法在物理設備上運行。 String TAG_STUFF = "stuff";
, "stuff"
與PHP文件對應: $response["stuff"] = array();
。 TAG_STUFF
基本上應該在$response["stuff"]
使用什么。 希望以上所有都有道理。 如果您需要幫助,請評論。 ;-)
更新工作解決方案:
這確實非常奇怪。 但是,我有一個有效的解決方案。 使用OP的代碼時,應用程序確實崩潰了。 由於沒有時間來測試它崩潰的原因,我直接發布了一個解決方案。
首先,不要將testing
保持為獨立類,而是將其創建為MainActivity
的內部類。
class testing extends AsyncTask<Void, Void, Void> {
....
}
其次,全局聲明變量( jParser
, URL_TO_PHP
等 ),與onPreExecute()
之前的當前聲明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);
}
}
}
在測試時,我還拍了一些結果。 這里是:
再一次,因為我現在感到有點瘦,我將無法找出導致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);
}
來自: 鏈接
你必須使用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");
}
我希望這個對你有所幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.