#android #json
#Android #json
Вопрос:
Я пытаюсь отправить user_id
на PHP через JSON, но он показывает Error parsing data org.json.JSONException: Value 2 of type java.lang.Integer cannot be converted to JSONObject
.
Как я могу заставить это работать? Заранее благодарю вас.
Класс :
public class Home1 extends Activity {
JSONObject jsonobject;
JSONArray jsonarray;
ListView listview;
ListViewAdapter1 adapterrr;
SharedPreferences pref;
String uid;
String user_i,us;
String ques_i;
ArrayList<HashMap<String, String>> arraylist;
//static String BET_ID = "bet_id";
static String QUESTION = "question";
static String QUES_ID = "ques_id";
static String ANSWER = "answer";
ArrayList<HashMap<String, String>> data;
HashMap<String, String> resultp = new HashMap<String, String>();
Set<String> newset=new HashSet<String>();
@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pref = PreferenceManager.getDefaultSharedPreferences(this);
setContentView(R.layout.questionlist1);
uid = pref.getString("user_id",null);
Log.d("uid", "" uid);
Intent i = getIntent();
ques_i = i.getStringExtra("qsid");
Log.d("qsid", "" ques_i);
new DownloadJSON().execute();
}
private class DownloadJSON extends AsyncTask<Void, Void, Void> {
/*protected ArrayList<NameValuePair> parameters;
public DownloadJSON() {
parameters = new ArrayList<NameValuePair>();
NameValuePair us = new BasicNameValuePair("user_id", uid);
parameters.add(us);
}*/
@Override
protected Void doInBackground(Void... params) {
arraylist = new ArrayList<HashMap<String, String>>();
/*jsonobject = JSONfunctions
.getJSONfromURL("http://192.168.1.23/mutilatedphp/QuizGame/filtercheck.php");*/
try {
jsonobject = JSONfunctions
.getJSONfromURL("http://192.168.1.23/mutilatedphp/QuizGame/filtercheck.php?user_id=" uid);
jsonarray = jsonobject.getJSONArray("ques");
for (int i = 0; i < jsonarray.length(); i ) {
HashMap<String, String> map = new HashMap<String, String>();
jsonobject = jsonarray.getJSONObject(i);
map.put("ques_id", jsonobject.getString("ques_id"));
map.put("question", jsonobject.getString("question"));
map.put("answer", jsonobject.getString("answer"));
arraylist.add(map);
}
} catch (JSONException e) {
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void args) {
listview = (ListView) findViewById(R.id.listView2);
adapterrr = new ListViewAdapter1(Home1.this, arraylist);
listview.setAdapter(adapterrr);
}
Комментарии:
1. Каков ваш json_response с сервера?
Ответ №1:
Проблема вызвана этой строкой
jsonobject = jsonarray.getJSONObject(i);
Вы пытаетесь преобразовать объект типа Integer в JSONObject. Проблема на стороне сервера. Пожалуйста, отправьте свой ответ, если вы обнаружили проблему, чтобы я мог проверить, прав ли я здесь.
Комментарии:
1. Вот как выглядит ссылка, когда
user_id
не передается :{"success":0,"message":"No Categories found"}
. Добавление идентификатора пользователя показывает:{"ques":[{"ques_id":"3","question":"What is the currency of Japan?","answer":"Yen"}],"success":1,"message":"Successfully found "}
Ответ №2:
Я думаю, проблема в том, что вы не проверили, существует ли атрибут ‘ques’. Когда вы используете getJSONArray()
метод для несуществующего атрибута, библиотека JSON выдаст исключение и приведет к сбою вашего приложения.
Вы можете взглянуть на мой маленький пример, он проверяет существование ‘ques’, прежде чем делать что-либо дальше:
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;
public class SimpleTest {
public static void main(String[] args) {
String notOk = "{n"
"t"success":0,n"
"t"message":"No Categories found"n"
"}";
String ok = "{n"
"t"ques":n"
"tt[n"
"ttt{n"
"tttt"ques_id":"3",n"
"tttt"question":"What is the currency of Japan?",n"
"tttt"answer":"Yen"n"
"ttt}n"
"tt],n"
"t"success":1,n"
"t"message":"Successfully found "n"
"}";
JSONObject okJSON = new JSONObject(ok);
JSONObject notOkJSON = new JSONObject(notOk);
System.out.println(new SimpleTest().parseJson(okJSON));
System.out.println(new SimpleTest().parseJson(notOkJSON));
}
public Map<String, String> parseJson(JSONObject jsonObject) {
if (jsonObject.has("ques")) {
JSONArray jsonArray = jsonObject.getJSONArray("ques");
Map<String, String> map = new HashMap<String, String>();
for (int i = 0; i < jsonArray.length(); i ) {
JSONObject tempObject = jsonArray.getJSONObject(i);
map.put("ques_id", tempObject.getString("ques_id"));
map.put("question", tempObject.getString("question"));
map.put("answer", tempObject.getString("answer"));
}
return map;
} else {
return new HashMap<String, String>();
}
}
}
Или, совершенно нормально использовать атрибут ‘success’, чтобы проверить результат и сообщить вам, существует ли атрибут ‘ques’.
Надеюсь, мой ответ сможет вам немного помочь.