如何使用 JSON 从外部数据库填充微调器
How to fill spinner from an external database using JSON
我正在尝试填充来自 JSON 的 Spinner,它是我从 php 获得的,它正在与外部数据库通信。我不断收到 JSON 异常错误。
我想要的是一个下拉列表,我可以在其中 select 宠物类型(即狗、猫、鱼等)
这是我从 JSONParser
:
得到的 JSON
{"success":1,"0":{"pets_kind":"dog"},"1":{"pets_kind":"cat"}}
这是我的 PHP:
DB_Functions.php
:
public function getPetKind(){
$result = array();
$fetch = mysql_query("SELECT pets_kind FROM PetsList") or die(mysql_error());
while ($row = mysql_fetch_array($fetch, MYSQL_ASSOC)) {
$row_array['pets_kind'] = $row['pets_kind'];
array_push($result,$row_array);
}
return $result;
}
index.php:
}else if($tag == 'getpetkind'){
$pets_kind = array();
$pets_kind = $db->getPetKind();
if($pets_kind != false){
$response = array();
$response["success"]=1;
foreach ($pets_kind as $row) {
$row_array['pets_kind'] = $row['pets_kind'];
array_push($response,$row_array);
}
echo json_encode($response);
}
填写我在 OnCreate()
期间调用的 asyncTask 下拉列表:
private class FillDropDown extends AsyncTask<String,Void,JSONObject>{
@Override
protected void onPreExecute(){
super.onPreExecute();
petsKindDropDown = (Spinner) findViewById(R.id.petsKindDropDown);
}
@Override
protected JSONObject doInBackground(String... args){
UserFunctions userFunctions = new UserFunctions();
JSONObject json = userFunctions.getPetsKind();
return json;
}
@Override
protected void onPostExecute(JSONObject json){
/**
* Checks for success message
*/
try{
if(json.getString(KEY_SUCCESS) != null){
ArrayList<String> kind = new ArrayList<String>();
JSONArray jsonArr = new JSONArray(json.optString("pets_kind"));
for(int i = 0; i < jsonArr.length(); i++){
JSONObject jsonObject = jsonArr.getJSONObject(i);
kind.add(jsonObject.optString("pets_kind"));
}
petsKindDropDown.setAdapter(new ArrayAdapter<String>(AddPet.this,
android.R.layout.simple_spinner_dropdown_item,kind));
}
else{
addPetAlertText.setText("Error occured in Filling Drop down");
}
} catch (JSONException e){
e.printStackTrace();
}
}
}
错误:
W/System.err: org.json.JSONException: End of input at character 0 of
W/System.err: at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
W/System.err: at org.json.JSONTokener.nextValue(JSONTokener.java:97)
W/System.err: at org.json.JSONArray.<init>(JSONArray.java:92)
W/System.err: at org.json.JSONArray.<init>(JSONArray.java:108)
W/System.err: at com.adicili.petdetective.AddPet$FillDropDown.onPostExecute(AddPet.java:133)
W/System.err: at com.adicili.petdetective.AddPet$FillDropDown.onPostExecute(AddPet.java:103)
W/System.err: at android.os.AsyncTask.finish(AsyncTask.java:651)
W/System.err: at android.os.AsyncTask.-wrap1(AsyncTask.java)
W/System.err: at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err: at android.os.Looper.loop(Looper.java:148)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
像这样更改 PHP
函数:
public function getPetKind(){
$result = array();
$fetch = mysql_query("SELECT pets_kind FROM PetsList") or die(mysql_error());
while ($row = mysql_fetch_array($fetch, MYSQL_ASSOC)) {
$result[] = $row;
}
return $result;
}
并像这样构建 json:
$response = array();
$pets_kind = $db->getPetKind();
if(count($pets_kind) > 0){
$response["success"]=1;
$response["result"]=$pets_kind;
}else{
$response["success"]=0;
$response["result"]='no pet found';
}
echo json_encode($response);
然后是您的 java 代码,如下所示:
ArrayList<String> kind = new ArrayList<String>();
JSONArray jsonArr = json.getJSONArray("result");
for(int i = 0; i < jsonArr.length(); i++){
JSONObject jsonObject = jsonArr.getJSONObject(i);
kind.add(jsonObject.optString("pets_kind"));
}
我正在尝试填充来自 JSON 的 Spinner,它是我从 php 获得的,它正在与外部数据库通信。我不断收到 JSON 异常错误。
我想要的是一个下拉列表,我可以在其中 select 宠物类型(即狗、猫、鱼等)
这是我从 JSONParser
:
{"success":1,"0":{"pets_kind":"dog"},"1":{"pets_kind":"cat"}}
这是我的 PHP:
DB_Functions.php
:
public function getPetKind(){
$result = array();
$fetch = mysql_query("SELECT pets_kind FROM PetsList") or die(mysql_error());
while ($row = mysql_fetch_array($fetch, MYSQL_ASSOC)) {
$row_array['pets_kind'] = $row['pets_kind'];
array_push($result,$row_array);
}
return $result;
}
index.php:
}else if($tag == 'getpetkind'){
$pets_kind = array();
$pets_kind = $db->getPetKind();
if($pets_kind != false){
$response = array();
$response["success"]=1;
foreach ($pets_kind as $row) {
$row_array['pets_kind'] = $row['pets_kind'];
array_push($response,$row_array);
}
echo json_encode($response);
}
填写我在 OnCreate()
期间调用的 asyncTask 下拉列表:
private class FillDropDown extends AsyncTask<String,Void,JSONObject>{
@Override
protected void onPreExecute(){
super.onPreExecute();
petsKindDropDown = (Spinner) findViewById(R.id.petsKindDropDown);
}
@Override
protected JSONObject doInBackground(String... args){
UserFunctions userFunctions = new UserFunctions();
JSONObject json = userFunctions.getPetsKind();
return json;
}
@Override
protected void onPostExecute(JSONObject json){
/**
* Checks for success message
*/
try{
if(json.getString(KEY_SUCCESS) != null){
ArrayList<String> kind = new ArrayList<String>();
JSONArray jsonArr = new JSONArray(json.optString("pets_kind"));
for(int i = 0; i < jsonArr.length(); i++){
JSONObject jsonObject = jsonArr.getJSONObject(i);
kind.add(jsonObject.optString("pets_kind"));
}
petsKindDropDown.setAdapter(new ArrayAdapter<String>(AddPet.this,
android.R.layout.simple_spinner_dropdown_item,kind));
}
else{
addPetAlertText.setText("Error occured in Filling Drop down");
}
} catch (JSONException e){
e.printStackTrace();
}
}
}
错误:
W/System.err: org.json.JSONException: End of input at character 0 of
W/System.err: at org.json.JSONTokener.syntaxError(JSONTokener.java:449)
W/System.err: at org.json.JSONTokener.nextValue(JSONTokener.java:97)
W/System.err: at org.json.JSONArray.<init>(JSONArray.java:92)
W/System.err: at org.json.JSONArray.<init>(JSONArray.java:108)
W/System.err: at com.adicili.petdetective.AddPet$FillDropDown.onPostExecute(AddPet.java:133)
W/System.err: at com.adicili.petdetective.AddPet$FillDropDown.onPostExecute(AddPet.java:103)
W/System.err: at android.os.AsyncTask.finish(AsyncTask.java:651)
W/System.err: at android.os.AsyncTask.-wrap1(AsyncTask.java)
W/System.err: at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
W/System.err: at android.os.Handler.dispatchMessage(Handler.java:102)
W/System.err: at android.os.Looper.loop(Looper.java:148)
W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5417)
W/System.err: at java.lang.reflect.Method.invoke(Native Method)
W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
像这样更改 PHP
函数:
public function getPetKind(){
$result = array();
$fetch = mysql_query("SELECT pets_kind FROM PetsList") or die(mysql_error());
while ($row = mysql_fetch_array($fetch, MYSQL_ASSOC)) {
$result[] = $row;
}
return $result;
}
并像这样构建 json:
$response = array();
$pets_kind = $db->getPetKind();
if(count($pets_kind) > 0){
$response["success"]=1;
$response["result"]=$pets_kind;
}else{
$response["success"]=0;
$response["result"]='no pet found';
}
echo json_encode($response);
然后是您的 java 代码,如下所示:
ArrayList<String> kind = new ArrayList<String>();
JSONArray jsonArr = json.getJSONArray("result");
for(int i = 0; i < jsonArr.length(); i++){
JSONObject jsonObject = jsonArr.getJSONObject(i);
kind.add(jsonObject.optString("pets_kind"));
}