2013-12-18 10 views
5

Il collegamento è http://iipacademy.in/askpoll/ten_feed.phpJSON tipo disadattamento o org.json.jsonecxeption

eccezione è OnPostExecute() metodo (linea 4):

Log.i("result", result); 
try { 
    if (result != null) { 
     JSONArray jsonArray = new JSONArray(result); // erreor 
     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject objJson = jsonArray.getJSONObject(i); 

      TopTenGetterSetter obj = new TopTenGetterSetter(); 


      obj.setQ(objJson.getString("question")); 
      obj.setA(objJson.getString("option1")); 
      obj.setB(objJson.getString("option2")); 
      obj.setC(objJson.getString("option3")); 
      obj.setD(objJson.getString("option4")); 

      polls.add(obj); 
         } 

    } 
} catch (JSONException e) { 
    e.printStackTrace(); 
    Toast.makeText(getApplicationContext(), "error", 
      Toast.LENGTH_SHORT).show(); 
} 

Logcat:

12-18 03:20:45.447: W/System.err(2790): org.json.JSONException: Value response of type java.lang.String cannot be converted to JSONArray 
12-18 03:20:45.447: W/System.err(2790):  at org.json.JSON.typeMismatch(JSON.java:111) 
12-18 03:20:45.447: W/System.err(2790):  at org.json.JSONArray.<init>(JSONArray.java:91) 
12-18 03:20:45.447: W/System.err(2790):  at org.json.JSONArray.<init>(JSONArray.java:103) 
12-18 03:20:45.447: W/System.err(2790):  at com.example.askpollie.LatestPollParticipated$FetchingEventsDetails.onPostExecute(LatestPollParticipated.java:188) 
12-18 03:20:45.447: W/System.err(2790):  at com.example.askpollie.LatestPollParticipated$FetchingEventsDetails.onPostExecute(LatestPollParticipated.java:1) 
12-18 03:20:45.447: W/System.err(2790):  at android.os.AsyncTask.finish(AsyncTask.java:631) 
12-18 03:20:45.447: W/System.err(2790):  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
12-18 03:20:45.447: W/System.err(2790):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
12-18 03:20:45.447: W/System.err(2790):  at android.os.Handler.dispatchMessage(Handler.java:99) 
12-18 03:20:45.447: W/System.err(2790):  at android.os.Looper.loop(Looper.java:137) 
12-18 03:20:45.447: W/System.err(2790):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
12-18 03:20:45.447: W/System.err(2790):  at java.lang.reflect.Method.invokeNative(Native Method) 
12-18 03:20:45.447: W/System.err(2790):  at java.lang.reflect.Method.invoke(Method.java:525) 
12-18 03:20:45.447: W/System.err(2790):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
12-18 03:20:45.447: W/System.err(2790):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-18 03:20:45.447: W/System.err(2790):  at dalvik.system.NativeStart.main(Native Method) 
12-18 03:20:45.447: D/dalvikvm(2790): GC_FOR_ALLOC freed 5131K, 55% free 4437K/9672K, paused 2ms, total 2ms 

Messaggio è un array quindi quale dovrebbe essere il suo codice o come può essere risolto?

Grazie in anticipo. . .

+0

dato che il servizio web restituisce 'JSONObject' come elemento radice invece di' JSONArray' –

+0

si potrebbe usare qualcosa come 'new org.json.simple.parser.JSONParser(). Parse (" jsonString ");' per ottenere JsonArray. – Runcorn

+0

pubblica i tuoi dati JSON –

risposta

16
org.json.JSONException: Value response of type java.lang.String cannot be converted to JSONArray 

Sembra che la risposta sia una stringa non un array json

{ // json object node 
    "response": { // json object response 
     "result": 1, 
     "Message": [ // json array Message 
      {  // json object node 
       "pollid": "98", 
       "category": "Entertainment", 
       "question": "what", // string 
       "option1": "981.mov", 

Il risultato è un oggetto JSON non matrice json

JSONArray jsonArray = new JSONArray(result); 

Dovrebbe essere

JSONObject jObj = new JSONObject(result); 
JSONObject response = jObj.getJSONObject("response"); 
//JSONObject jb = new JSONObject(response); 
JSONArray jr = response.getJSONArray("Message"); 
for(int i=0;i<jr.length();i++) 
{ 
JSONObject jb1 = jr.getJSONObject(i); 
String question = jb1.getString("question"); 
Log.i(".......",question); 
} 
0

Il risultato non è un array, il messaggio è.

0
Value response of type java.lang.String cannot be converted to JSONArray 

Si sta tentando di convertire un singolo oggetto in un array.

1

Prova questa:

Log.i("result", result); 
try { 
    if (result != null) { 
     JSONObject jObject = new JSONObject(result); 
     JSONArray jsonArray = jObject.getJSONObject("response").getJSONArray("Message"); 
     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject objJson = jsonArray.getJSONObject(i); 

      TopTenGetterSetter obj = new TopTenGetterSetter(); 
      /* 
      * [{"job_id":"1","job_staff_id":"","job_name":"Account", 
      * "job_detail":"test\r\ntesds","job_start_date": 
      * "2013-11-08" 
      * ,"job_end_date":"2013-11-10","job_amount":"500" 
      * ,"job_progress":"","job_complete_status":"0"}] 
      */ 

      obj.setQ(objJson.getString("question")); 
      obj.setA(objJson.getString("option1")); 
      obj.setB(objJson.getString("option2")); 
      obj.setC(objJson.getString("option3")); 
      obj.setD(objJson.getString("option4")); 

      polls.add(obj); 
      // am = Customer.info.get(pos).getJamount(); 

      // Toast.makeText(getApplicationContext(), am + result, 
      // Toast.LENGTH_LONG).show(); 
     } 

    } 
} catch (JSONException e) { 
    e.printStackTrace(); 
    Toast.makeText(getApplicationContext(), "error", 
      Toast.LENGTH_SHORT).show(); 
} 

come Mario e nfear detto, si sta tentando di lanciare un JSONObject in un JSONArray.

1

contenuti String JSONObject come elemento principale, invece di ottenere JSONArray.to Message JSONArray da String si deve prima ottenere response JSONObject quindi ottenere Message JSONArray come:

JSONObject jsonobj = new JSONObject(result); 
// get response JSONObject 

JSONObject jsonobj_response = jsonobj.getJSONObject("response"); 

// get Message JSONArray from jsonobj_response 

JSONArray jsonArray = jsonobj_response.getJSONArray("Message"); 
    // your code here..... 
1

Prova questa,

try { 
    if (result != null) { 
     JSONArray jsonArray = new JSONObject(result).getJSONObject("response").getJSONArray("Message"); 
     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject objJson = jsonArray.getJSONObject(i); 

      TopTenGetterSetter obj = new TopTenGetterSetter(); 
      /* 
      * [{"job_id":"1","job_staff_id":"","job_name":"Account", 
      * "job_detail":"test\r\ntesds","job_start_date": 
      * "2013-11-08" 
      * ,"job_end_date":"2013-11-10","job_amount":"500" 
      * ,"job_progress":"","job_complete_status":"0"}] 
      */ 

      obj.setQ(objJson.getString("question")); 
      obj.setA(objJson.getString("option1")); 
      obj.setB(objJson.getString("option2")); 
      obj.setC(objJson.getString("option3")); 
      obj.setD(objJson.getString("option4")); 

      polls.add(obj); 
      // am = Customer.info.get(pos).getJamount(); 

      // Toast.makeText(getApplicationContext(), am + result, 
      // Toast.LENGTH_LONG).show(); 
     } 

    } 
} 
0

meglio usare biblioteca GSON invece di parsing manualmente. GSON lo puoi trovare su goggling. e esempi di esempio sono forniti con quello.

1

Il JSON avete pubblicato sta avendo

// Key "response" , Value type JsonObject 

JSONObject jsonObject=jsonObjectOfRsponse.getJsonObject(key); 

//Key "Message" , Value type Json Array 

JSONArray jsonArray=jsonObject.getJsonArray(key); 

Dopo avere ottenuto l'jsonArray, utilizzare questo in un ciclo per analizzare il JSON in base al tipo di valore al suo interno.

Quindi controllare se si sta analizzando il json in base al tipo di valore che è in attesa.