Android: Ошибка при анализе данных и не может быть преобразован в JSONObject

#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’.
Надеюсь, мой ответ сможет вам немного помочь.